tài liệu tham khảo Confusing với cùng đối tượng (có thể thay đổi) với tham chiếu đến đối tượng riêng biệt thực sự là một " gotcha "(chịu đựng bởi tất cả các ngôn ngữ không phải chức năng, những ngôn ngữ có đối tượng có thể thay đổi và, tất nhiên, tham chiếu). Một lỗi thường thấy trong mã Python người mới bắt đầu đang lạm dụng một giá trị mặc định là có thể thay đổi, ví dụ:
def addone(item, alist=[]):
alist.append(item)
return alist
Mã này có thể đúng nếu mục đích là để có addone
giữ trạng thái của nó (và trở về danh sách một phát triển cho người gọi kế tiếp), nhiều như dữ liệu static
sẽ hoạt động trong C; nó không chính xác nếu các coder là sai giả định rằng một danh sách trống mới sẽ được thực hiện tại mỗi cuộc gọi.
Người mới bắt đầu sử dụng ngôn ngữ chức năng cũng có thể bị nhầm lẫn bởi quyết định thiết kế trong các thùng chứa tích hợp của Python: (cụ thể, họ trả lại None
) - họ đang làm tất cả công việc của họ "tại chỗ". Lỗi đến từ sự hiểu lầm này rất dễ phát hiện, ví dụ:
alist = alist.append(item)
được khá nhiều đảm bảo được một lỗi - nó gắn thêm một mục vào danh sách được gọi bằng tên alist
, nhưng sau đó rebinds tên alist
-None
(giá trị trả về của append
cuộc gọi).
Trong khi vấn đề đầu tiên tôi đề cập là một sự ràng buộc sớm có thể đánh lừa những người nghĩ rằng ràng buộc, thay vào đó, một người muộn, có những vấn đề đi theo một cách khác. trong khi ràng buộc là, thay vào đó, muộn. Ví dụ (với một khuôn khổ giả GUI ...):
for i in range(10):
Button(text="Button #%s" % i,
click=lambda: say("I'm #%s!" % i))
này sẽ hiển thị mười nút cho biết "Nút # 0", "Button # 1", vv, nhưng khi nhấn vào, mỗi một trong họ sẽ say
là #9
- bởi vì i
trong số lambda
bị ràng buộc muộn (có đóng cửa từ vựng). Một sửa chữa là để tận dụng thực tế là giá trị mặc định cho tham số là sớm bị ràng buộc (như tôi đã chỉ ra về vấn đề đầu tiên -!) Và thay đổi dòng cuối cùng để
click=lambda i=i: say("I'm #%s!" % i))
Bây giờ lambda
's i
là một đối số với một giá trị mặc định, không phải là một biến miễn phí (nhìn lên bằng cách đóng dấu từ vựng) nữa, và vì vậy mã hoạt động như dự định (dĩ nhiên cũng có những cách khác).
Đó là Gotcha chính cho tôi trong việc chuyển sang Python, nhưng tôi nghĩ rằng nó cũng là một Gotcha phổ biến cho những người bắt đầu sử dụng Python mà không cần phải sử dụng Matlab trước. Tôi có thể sai mặc dù. –
Liên quan: http://zephyrfalcon.org/labs/python_pitfalls.html http://www.ferg.org/projects/python_gotchas.html – jfs