Bạn đang sử dụng
None
1
None
5. None
1
None
6 trở thành một biểu tượng trong phạm vi toàn cầu của mô-đun nhập [hoặc bất kỳ phạm vi nào mà câu lệnh nhập xảy ra]Khi bạn gán một giá trị mới cho
None
1
None
6, bạn chỉ đang thay đổi giá trị mà None
1
None
6 trỏ tới, chứ không phải giá trị thực. Cố gắng nhập trực tiếp None
1
None
3 với z = x | y # NOTE: 3.9+ ONLY
0 trong None
1
None
4 và tiến hành thử nghiệm của bạn ở đó bằng cách đặt z = x | y # NOTE: 3.9+ ONLY
2. Bằng cách này, bạn sẽ thực sự sửa đổi z = x | y # NOTE: 3.9+ ONLY
3, đây là giá trị 'thực' của None
1
None
6 trong ngữ cảnh nàyNó hơi phức tạp với ba lớp nhưng
z = x | y # NOTE: 3.9+ ONLY
2 thay đổi giá trị của None
1
None
6 trong mô-đun có tên là None
1
None
2 thực sự bắt nguồn từ None
1
None
4. Nó không thay đổi giá trị của None
1
None
6 mà None
1
None
50 nhìn thấy vì None
1
None
50 sống trong tệp thực tế None
1
None
3. Bạn có thể đặt None
1
None
53 nếu bạn muốn thay đổi điều đóĐây là một trong những mối nguy hiểm khi sử dụng mẫu
None
1
None
54 của câu lệnh None
1
None
55. nó chia tách None
1
None
2 thành hai biểu tượng, một biểu tượng có thể nhìn thấy trên toàn cầu từ bên trong None
1
None
57 bắt đầu trỏ đến giá trị ban đầu và một biểu tượng khác có thể nhìn thấy trong phạm vi nơi câu lệnh None
1
None
55 được thực thi. Thay đổi vị trí điểm biểu tượng cũng không thay đổi giá trị mà nó chỉLoại nội dung này là kẻ giết người khi cố gắng
None
1
None
59 một mô-đun từ trình thông dịch tương tácGiải pháp liên quan
Python – Cách hợp nhất hai từ điển trong một biểu thức [lấy hợp nhất từ điển]
Làm cách nào tôi có thể hợp nhất hai từ điển Python trong một biểu thức?
Đối với từ điển
None
1
None
50 và None
1
None
51, None
1
None
52 trở thành một từ điển được kết hợp nông với các giá trị từ None
1
None
51 thay thế các giá trị từ None
1
None
50Trong Trăn 3. 9. 0 trở lên [phát hành ngày 17 tháng 10 năm 2020]. PEP-584, được thảo luận ở đây, đã được triển khai và cung cấp phương pháp đơn giản nhất
z = x | y # NOTE: 3.9+ ONLY
Trong Trăn 3. 5 hoặc cao hơn
5None 1 None
Trong Python 2, [hoặc 3. 4 hoặc thấp hơn] hãy viết một hàm
5None 1 None
và bây giờ
3None 1 None
Giải trình
Giả sử bạn có hai từ điển và bạn muốn hợp nhất chúng thành một từ điển mới mà không làm thay đổi từ điển gốc
None
1
None
4Kết quả mong muốn là có được một từ điển mới [
None
1
None
52] với các giá trị được hợp nhất và các giá trị của từ điển thứ hai sẽ ghi đè lên các giá trị từ từ điển đầu tiênNone
1
None
60Một cú pháp mới cho điều này, được đề xuất trong PEP 448 và có sẵn kể từ Python 3. 5, là
None
1
None
5Và nó thực sự là một biểu thức duy nhất
Lưu ý rằng chúng ta cũng có thể hợp nhất với ký hiệu chữ
None
1
None
62và bây giờ
None
1
None
63Nó hiện đang hiển thị như được triển khai trong và hiện đã được đưa vào tài liệu
Tuy nhiên, vì nhiều tổ chức vẫn đang sử dụng Python 2, nên bạn có thể muốn thực hiện việc này theo cách tương thích ngược. Cách cổ điển của Pythonic, có sẵn trong Python 2 và Python 3. 0-3. 4, là thực hiện điều này như một quy trình gồm hai bước
None
1
None
64Trong cả hai cách tiếp cận,
None
1
None
51 sẽ đứng thứ hai và các giá trị của nó sẽ thay thế các giá trị của None
1
None
50, do đó, None
1
None
58 sẽ trỏ đến None
1
None
59 trong kết quả cuối cùng của chúng tôiChưa có trên Python 3. 5, nhưng muốn có một biểu thức duy nhất
Nếu bạn chưa sử dụng Python 3. 5 hoặc cần viết mã tương thích ngược và bạn muốn điều này trong một biểu thức duy nhất, cách hiệu quả nhất trong khi cách tiếp cận đúng là đặt nó trong một hàm
None
1
None
65và sau đó bạn có một biểu thức duy nhất
None
1
None
3Bạn cũng có thể tạo một hàm để hợp nhất một số lượng từ điển tùy ý, từ số không đến số lượng rất lớn
None
1
None
67Chức năng này sẽ hoạt động trong Python 2 và 3 cho tất cả các từ điển. e. g. từ điển đã cho
None
1
None
6 đến None
1
None
31None
1
None
68và các cặp khóa-giá trị trong
None
1
None
31 sẽ được ưu tiên hơn từ điển None
1
None
6 đến None
1
None
34, v.v.Phê bình các câu trả lời khác
Không sử dụng những gì bạn thấy trong câu trả lời được chấp nhận trước đây
None
1
None
69Trong Python 2, bạn tạo hai danh sách trong bộ nhớ cho mỗi lệnh, tạo danh sách thứ ba trong bộ nhớ có độ dài bằng với độ dài của hai danh sách đầu tiên được ghép lại với nhau, sau đó loại bỏ cả ba danh sách để tạo lệnh. Trong Python 3, điều này sẽ không thành công vì bạn đang thêm hai đối tượng
None
1
None
35 lại với nhau, không phải hai danh sách -z = x | y # NOTE: 3.9+ ONLY
60và bạn sẽ phải tạo chúng một cách rõ ràng dưới dạng danh sách, e. g.
None
1
None
36. Đây là một sự lãng phí tài nguyên và sức mạnh tính toánTương tự, lấy hợp của
None
1
None
37 trong Python 3 [______338 trong Python 2. 7] cũng sẽ thất bại khi các giá trị là các đối tượng không thể băm được [ví dụ như danh sách]. Ngay cả khi các giá trị của bạn có thể băm được, vì các bộ không có thứ tự về mặt ngữ nghĩa, nên hành vi không được xác định liên quan đến mức độ ưu tiên. Vì vậy, đừng làm điều nàyz = x | y # NOTE: 3.9+ ONLY
61Ví dụ này minh họa điều gì sẽ xảy ra khi các giá trị không thể băm được
z = x | y # NOTE: 3.9+ ONLY
62Đây là một ví dụ trong đó
None
1
None
51 nên được ưu tiên, nhưng thay vào đó, giá trị từ None
1
None
50 được giữ lại do thứ tự tùy ý của các tập hợpz = x | y # NOTE: 3.9+ ONLY
63Một hack khác bạn không nên sử dụng
z = x | y # NOTE: 3.9+ ONLY
64Điều này sử dụng hàm tạo
None
1
None
41 và rất nhanh và tiết kiệm bộ nhớ [thậm chí còn hơn một chút so với quy trình hai bước của chúng tôi] nhưng trừ khi bạn biết chính xác điều gì đang xảy ra ở đây [nghĩa là lệnh thứ hai đang được chuyển dưới dạng đối số từ khóa cho lệnh dict Đây là một ví dụ về việc sử dụng đang được khắc phục trong django
Từ điển nhằm mục đích lấy các khóa có thể băm [e. g.
None
1
None
42 hoặc bộ dữ liệu], nhưng phương thức này không thành công trong Python 3 khi khóa không phải là chuỗiz = x | y # NOTE: 3.9+ ONLY
65Từ danh sách gửi thư, Guido van Rossum, người tạo ra ngôn ngữ này, đã viết
Tôi ổn với việc khai báo dict[{}, **{1. 3}] bất hợp pháp, vì suy cho cùng đó là lạm dụng cơ chế **
và
Rõ ràng dict[x, **y] đang diễn ra dưới dạng "hack hay" cho "gọi x. cập nhật [y] và trả lại x". Cá nhân tôi thấy nó đáng khinh hơn là ngầu
Theo sự hiểu biết của tôi [cũng như sự hiểu biết của người tạo ra ngôn ngữ] rằng mục đích sử dụng cho
None
1
None
43 là để tạo từ điển cho mục đích dễ đọc, e. gz = x | y # NOTE: 3.9+ ONLY
66thay vì
z = x | y # NOTE: 3.9+ ONLY
67Phản hồi bình luận
Bất chấp những gì Guido nói,
44 phù hợp với đặc tả chính tả, btw. hoạt động cho cả Python 2 và 3. Thực tế là điều này chỉ hoạt động đối với các khóa chuỗi là hệ quả trực tiếp của cách thức hoạt động của các tham số từ khóa và không phải là sự thiếu sót của dict. Việc sử dụng toán tử ** ở đây cũng không phải là lạm dụng cơ chế, trên thực tế, ** được thiết kế chính xác để chuyển từ điển dưới dạng từ khóaNone 1 None
Một lần nữa, nó không hoạt động trong 3 khi các phím không phải là chuỗi. Hợp đồng gọi ẩn là các không gian tên lấy từ điển thông thường, trong khi người dùng chỉ phải chuyển đối số từ khóa là chuỗi. Tất cả các cuộc gọi khác đã thực thi nó.
None
1
None
41 đã phá vỡ tính nhất quán này trong Python 2z = x | y # NOTE: 3.9+ ONLY
68Sự không nhất quán này rất tệ khi triển khai Python khác [PyPy, Jython, IronPython]. Do đó, nó đã được sửa trong Python 3, vì cách sử dụng này có thể là một thay đổi đột phá
Tôi trình bày với bạn rằng việc cố ý viết mã chỉ hoạt động trong một phiên bản của ngôn ngữ hoặc mã chỉ hoạt động với một số ràng buộc tùy ý nhất định là hành vi cố tình viết mã không hoạt động.
Thêm bình luận
46 vẫn là giải pháp dễ đọc nhất cho Python 2. số lượng khả năng đọcNone 1 None
câu trả lời của tôi.
None
1
None
47 thực sự có vẻ rõ ràng hơn nhiều đối với tôi, nếu chúng tôi thực sự quan tâm đến khả năng đọc. Và nó không tương thích về phía trước, vì Python 2 ngày càng không được dùng nữa48 dường như không xử lý các từ điển lồng nhau. nội dung của các khóa lồng nhau chỉ được ghi đè, không được hợp nhất [. ] Cuối cùng tôi đã bị đốt cháy bởi những câu trả lời không hợp nhất theo cách đệ quy này và tôi đã rất ngạc nhiên khi không ai đề cập đến nó. Theo cách giải thích của tôi về từ "hợp nhất", những câu trả lời này mô tả "cập nhật một lệnh này với một lệnh khác" và không hợp nhấtNone 1 None
Đúng. Tôi phải giới thiệu bạn trở lại câu hỏi, yêu cầu hợp nhất nông của hai từ điển, với các giá trị của từ đầu tiên bị ghi đè bởi từ thứ hai - trong một biểu thức
Giả sử hai từ điển của các từ điển, người ta có thể hợp nhất chúng một cách đệ quy trong một hàm duy nhất, nhưng bạn nên cẩn thận để không sửa đổi từ điển từ cả hai nguồn và cách chắc chắn nhất để tránh điều đó là tạo một bản sao khi gán giá trị. Vì các khóa phải có thể băm được và do đó thường không thay đổi, nên việc sao chép chúng là vô nghĩa
z = x | y # NOTE: 3.9+ ONLY
69Cách sử dụng
z = x | y # NOTE: 3.9+ ONLY
90Việc đưa ra các trường hợp dự phòng cho các loại giá trị khác vượt xa phạm vi của câu hỏi này, vì vậy tôi sẽ chỉ cho bạn câu trả lời của tôi cho câu hỏi kinh điển trên "Từ điển hợp nhất từ điển"
Ít hiệu quả hơn nhưng Ad-hocs chính xác
Những cách tiếp cận này kém hiệu quả hơn, nhưng chúng sẽ cung cấp hành vi đúng. Chúng sẽ kém hiệu quả hơn nhiều so với
None
1
None
49 và None
1
None
600 hoặc giải nén mới vì chúng lặp qua từng cặp khóa-giá trị ở mức độ trừu tượng cao hơn, nhưng chúng tôn trọng thứ tự ưu tiên [các từ điển sau này được ưu tiên hơn]Bạn cũng có thể xâu chuỗi các từ điển theo cách thủ công bên trong phần đọc chính tả
z = x | y # NOTE: 3.9+ ONLY
91hoặc bằng Python 2. 6 [và có lẽ sớm nhất là 2. 4 khi các biểu thức trình tạo được giới thiệu]
z = x | y # NOTE: 3.9+ ONLY
92None
1
None
601 sẽ xâu chuỗi các trình vòng lặp qua các cặp khóa-giá trị theo đúng thứ tựz = x | y # NOTE: 3.9+ ONLY
93Phân tích hiệu suất
Tôi sẽ chỉ thực hiện phân tích hiệu suất của các tập quán được biết là hoạt động chính xác. [Tự chứa để bạn có thể sao chép và dán cho mình. ]
z = x | y # NOTE: 3.9+ ONLY
94Trong Trăn 3. 8. 1, Nix OS
________ 795 ________ 796Tài nguyên về từ điển
- The Dictionary Even Mightier - nói chuyện bởi Brandon Rhodes tại Pycon 2017
- Modern Python Dictionaries, A Confluence of Great Ideas - bài nói chuyện của Raymond Hettinger tại Pycon 2017
Python – Cách kiểm tra xem một tệp có tồn tại mà không có ngoại lệ hay không
Nếu lý do bạn đang kiểm tra là để bạn có thể làm điều gì đó như
None
1
None
602, thì sẽ an toàn hơn khi sử dụng None
1
None
603 xung quanh nỗ lực mở nó. Việc kiểm tra rồi mở có nguy cơ khiến tệp bị xóa hoặc bị di chuyển hoặc điều gì đó xảy ra giữa thời điểm bạn kiểm tra và khi bạn cố mở tệp đóNếu bạn không định mở tệp ngay lập tức, bạn có thể sử dụng
Trả lại
605 nếu đường dẫn là tệp thông thường hiện có. Điều này tuân theo các liên kết tượng trưng, vì vậy cả hai và có thể đúng cho cùng một đường dẫnNone 1 None
z = x | y # NOTE: 3.9+ ONLY
97nếu bạn cần chắc chắn đó là một tập tin
Bắt đầu với Python 3. 4, cung cấp một cách tiếp cận hướng đối tượng [được nhập lại vào
None
1
None
607 trong Python 2. 7]z = x | y # NOTE: 3.9+ ONLY
98Để kiểm tra một thư mục, hãy làm
z = x | y # NOTE: 3.9+ ONLY
99Để kiểm tra xem một đối tượng
None
1
None
608 có tồn tại độc lập với tệp hay thư mục hay không, hãy sử dụng None
1
None
609