Hướng dẫn default arguments in python - đối số mặc định trong python
Show Đã đăng vào thg 6 19, 2020 1:18 SA 3 phút đọc 3 phút đọc Nguồn: https://qiita.com/yukinoi/items/57f6150c5d805d4b25e4 Những điều cần chú ý với giá trị đối số mặc định của Python. Gần đây tôi gặp rắc rối với việc những giá trị đối số mặc định của Python tự ý hoạt động. Nay tôi viết bài này để chia sẽ thông tin giúp sự việc này không xảy ra với các bạn. Môi trường là Python 3.7.7 và 3.8.3. Giá trị đối số default là gì? Ví dụ như trong đoạn code sau, thì giá trị đối số default là dt=datetime.now()
Cái bẫy của giá trị đối số mặc định của Python Trong đoạn code ở trên, thì đã gọi hàm show_second một lần. Tôi đã chỉnh để ba giây sau lại gọi hàm show_second một lần nữa.
Khi đó thì chuyện gì xảy ra? Dù đã sleep 3 giây nhưng mà khi gọi hàm show_second lần hai thì giá trị vẫn y hệt 3 giây trước. Thời gian dừng lại ư? Hay là Za Warudo? Hay là dùng Stand của Arate? ( reference bộ truyện tranh JoJo Bizzare Adventure) Hoạt động của giá trị đối số mặc định Python Tôi đã tìm hiểu trong tài liệu của Python thì thấy đoạn sau: Giá trị đối số mặc định thì khi thực hiện định nghĩa hàm số, sẽ đánh giá từ trái san phải.
Nói cách khác, giá trị đối số mặc định được ước tính một lần tại thời điểm xác định hàm, kết quả được lưu trong bộ nhớ và nếu giá trị đối số mặc định được sử dụng cho dù hàm đó được gọi bao nhiêu lần, kết quả đánh giá tại thời điểm xác định hàm được sử dụng. Nó dường như làm việc. Vì vậy, thật nguy hiểm khi sử dụng cái gì đó như datetime.now () mang lại kết quả khác nhau mỗi lần bạn gọi và / hoặc thứ gì đó yêu cầu tính thời gian thực làm giá trị đối số mặc định. Tương tự, bạn cần cẩn thận khi chỉ định danh sách hoặc từ điển làm giá trị đối số mặc định. (Cách sử dụng đối số mặc định trong các hàm và ghi chú Python | note.nkmk.me) Các biện pháp chống lại các giá trị đối số mặc định trong Python Vậy nên điều cần làm là đặt Không làm giá trị đối số mặc định và nếu không có giá trị, có vẻ tốt hơn là thay thế giá trị ban đầu muốn được đặt làm giá trị đối số mặc định. Dưới đây là một ví dụ.
Trên đây là nội dung những điều cần chú ý về đối số mặc định Python. All rights reserved ['sổ tay'] ['bút chì']['cục gôm'] Python3Nhưng như bạn có thể thấy trong đầu ra thực tế của chương trình mỗi khi chức năng được gọi, cùng một danh sách được sử dụng, không có danh sách mới nào được thực hiện trên một cuộc gọi mới. & NBSP; Ví dụ sử dụng từ điển
40 1 42We need to keep the following points in mind while calling functions:
{‘Eraser, 1} Calling
functions without keyword arguments Python3Nhưng như bạn có thể thấy trong đầu ra thực tế của chương trình mỗi khi chức năng được gọi, cùng một danh sách được sử dụng, không có danh sách mới nào được thực hiện trên một cuộc gọi mới. & NBSP; 7 8 9 0 1 2 3 9John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 3 9John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard5 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard7 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard8 9John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard5 John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard3 9John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard7 3Output: John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard Trong cuộc gọi đầu tiên, chỉ có một đối số bắt buộc và các đối số còn lại sử dụng các giá trị mặc định. Trong cuộc gọi thứ hai, giá trị LastName và tiêu chuẩn đối số được thay thế từ giá trị mặc định sang giá trị chuyển mới. Chúng ta có thể thấy thứ tự của các đối số rất quan trọng từ các cuộc gọi thứ 2, thứ 3 và thứ 4 của hàm. Python3
0 1 2 3 1 5 6 7 8 9 0 1 2 3{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}4 1John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard8 {'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1}4 1John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 3 1John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard7 #list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}4 #list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}5 1John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard5 #list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1}8 1John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard0 John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard8 Output: John Mark studies in Fifth Standard John Mark studies in Seventh Standard John Gates studies in Fifth Standard Trong cuộc gọi đầu tiên, chỉ có một đối số từ khóa bắt buộc. Trong cuộc gọi thứ hai, một là một đối số bắt buộc và một là tùy chọn (tiêu chuẩn), có giá trị được thay thế từ mặc định sang giá trị chuyển mới. Trong cuộc gọi thứ ba, chúng ta có thể thấy thứ tự đó trong đối số từ khóa không quan trọng. Python3
0 1 2 3 1 5 6 7 8 9 0 1 2 3 07Trong cuộc gọi đầu tiên, chỉ có một đối số từ khóa bắt buộc. Trong cuộc gọi thứ hai, một là một đối số bắt buộc và một là tùy chọn (tiêu chuẩn), có giá trị được thay thế từ mặc định sang giá trị chuyển mới. Trong cuộc gọi thứ ba, chúng ta có thể thấy thứ tự đó trong đối số từ khóa không quan trọng. 14 1 16 17‘
Trong cuộc gọi thứ ba, đối số từ khóa truyền không được khớp với các đối số từ khóa thực tế.Sử dụng các đối tượng có thể thay đổi làm giá trị đối số mặc định trong Python Điều này phải được thực hiện rất cẩn thận. Lý do là các giá trị mặc định của các đối số chỉ được đánh giá một lần khi điều khiển đạt đến hàm Python3Định nghĩa cho lần đầu tiên. Sau đó, các giá trị tương tự (hoặc các đối tượng có thể thay đổi) được tham chiếu trong các cuộc gọi hàm tiếp theo. & Nbsp; mọi thứ sẽ rõ ràng hơn nhiều với ví dụ 22 23
19 1 21 22 25 26 8 28 33 30 8 28 37 30
['notebook'] ['notebook', 'pencil'] ['notebook', 'pencil', 'eraser'] Đầu ra
['cục gôm'] Nhưng như bạn có thể thấy trong đầu ra thực tế của chương trình mỗi khi chức năng được gọi, cùng một danh sách được sử dụng, không có danh sách mới nào được thực hiện trên một cuộc gọi mới. & NBSP;Python3Ví dụ sử dụng từ điển
40 1 42
19 1 21 8 51 29John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 54 30 8 51 33John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 60 30 8 51 37John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 60 30
{'notebook': 4} {'notebook': 4, 'pencil': 1} {'notebook': 4, 'pencil': 1, 'eraser': 1} Đầu ra
['cục gôm'] Nhưng như bạn có thể thấy trong đầu ra thực tế của chương trình mỗi khi chức năng được gọi, cùng một danh sách được sử dụng, không có danh sách mới nào được thực hiện trên một cuộc gọi mới. & NBSP; Ví dụ sử dụng từ điển
40 1 42 222 44 1 46Python3 8 69 70 3Những gì bạn đã mong đợi nếu bạn cho rằng một từ điển mới được tạo trong mỗi cuộc gọi chức năng {‘Notebook, 4} {‘Bút chì: 1} 22 23
19 1 21 8 28 29 30 22 25 26 8 28 37 30 8 69 07 3 8 28 29 30{‘Notebook, 4} {‘Bút chì: 1}
40 1 42
19 1 21 8 51 29John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 54 30 8 51 33John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 60 30 8 51 37John Mark studies in Fifth Standard John Gates studies in Seventh Standard John Gates studies in Fifth Standard John Seventh studies in Fifth Standard4 60 30Đầu ra #list ['notebook'] ['pencil'] ['eraser'] #dictionary {'notebook': 4} {'pencil': 1} {'eraser': 1} Ở đây bạn có thể thấy rõ rằng mỗi khi một hàm được gọi và một danh sách hoặc từ điển không được truyền như một đối số cho hàm thì nó tạo ra một danh sách hoặc từ điển mới. |