Nếu "đến" được khởi tạo một lần, "không" sẽ không "Không" lần thứ hai được gọi?
to
sẽ trở thành None
nếu bạn không vượt qua một giá trị cho nó: append_to(1)
và chỉ khi to
là None
sẽ mã của bạn rebind tên địa phương to
vào một danh sách mới được tạo ra bên trong cơ thể của chức năng của bạn: to = []
.
Giá trị mặc định của hàm chỉ được gán khi, đó là bất cứ điều gì bạn chỉ định làm giá trị mặc định, đối tượng đó sẽ được sử dụng cho mọi cuộc gọi bạn thực hiện cho hàm và sẽ không thay đổi. giá trị sẽ được sử dụng cho mọi cuộc gọi bạn thực hiện với hàm. Vấn đề này khi bạn gán mutables như mặc định:
l = []
def defArgs(d=l) # default arguments, same default list for every call
d.append(1)
return d
defArgs() is l # Object identity test: True
Chạy hàm trên nhiều lần và bạn sẽ quan sát danh sách ngày càng tăng với các yếu tố hơn vì bạn nhận được chỉ có một bản duy nhất của giá trị mặc định tham số cho mỗi chức năng chia sẻ bởi tất cả các cuộc gọi chức năng . Nhưng hãy lưu ý tại đây:
def localVars(d=None):
if d is None:
d = [] # Different list for every call when d is None
d = []
được thực hiện mỗi khi bạn gọi localVars
; khi hàm kết thúc công việc của mình, mọi biến cục bộ sẽ được thu thập rác khi số tham chiếu giảm xuống 0, nhưng không phải là giá trị mặc định của đối số, chúng sẽ xuất hiện sau khi thực hiện hàm và thường không được thu thập rác sau khi thực thi chức năng.
Trong ví dụ xấu này (tôi gọi nó là xấu bởi vì nếu bạn vượt qua một 'str' điều này đi wreck ...) anyway, ở đây hoặc là' to' là 'None' hoặc là một danh sách.Bạn sẽ không tạo danh sách nếu 'to' không phải là' None'. Do đó, bạn chỉ gán một giá trị cho 'to' dưới lời gọi của kiểu này:' append_to ('dreamfly') 'trong trường hợp này:' append_to ('dreamfly', users) 'trong đó' users' sẽ là một danh sách, bạn không tạo danh sách bên trong hàm, bạn chỉ cần thêm giá trị ('users = [..., 'dreamfly']'). –
Đó là một ví dụ từ http://python-guide-pt-br.readthedocs.io/en/latest/writing/gotchas/ – dreamfly
Tôi đã đưa ra một số [phản hồi] (https://github.com/kennethreitz/python-guide/issue/813); ví dụ này sử dụng các đối tượng không thể thay đổi làm đối số mặc định, nhưng đó là một điều tốt nhưng việc xác thực bị thiếu có thể phá vỡ các phần khác của mã –