Biến mô-đun thay đổi Python

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ày

Nó 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ác

Giả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
50

  • Trong 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

    None
    1
    None
    
    5
  • Trong Python 2, [hoặc 3. 4 hoặc thấp hơn] hãy viết một hàm

    None
    1
    None
    
    5

    và bây giờ

    None
    1
    None
    
    3

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
4

Kế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ên

None
1
None
60

Mộ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
5

Và 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
62

và bây giờ

None
1
None
63

Nó 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
64

Trong 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ôi

Chư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
65

và sau đó bạn có một biểu thức duy nhất

None
1
None
3

Bạ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
67

Chứ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
31

None
1
None
68

và 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
69

Trong 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
60

và 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án

Tươ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ày

z = x | y          # NOTE: 3.9+ ONLY
61

Ví 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ợp

z = x | y          # NOTE: 3.9+ ONLY
63

Mộ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ỗi

z = x | y          # NOTE: 3.9+ ONLY
65

Từ 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ế **

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. g

z = x | y          # NOTE: 3.9+ ONLY
66

thay vì

z = x | y          # NOTE: 3.9+ ONLY
67

Phản hồi bình luận

Bất chấp những gì Guido nói,

None
1
None
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óa

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 2

z = x | y          # NOTE: 3.9+ ONLY
68

Sự 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

None
1
None
46 vẫn là giải pháp dễ đọc nhất cho Python 2. số lượng khả năng đọc

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ữa

None
1
None
48 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ất

Đú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
69

Cách sử dụng

z = x | y          # NOTE: 3.9+ ONLY
90

Việ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
91

hoặ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
92

None
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
93

Phâ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
94

Trong Trăn 3. 8. 1, Nix OS

________ 795 ________ 796

Tà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

None
1
None
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ẫn

z = x | y          # NOTE: 3.9+ ONLY
97

nế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

Các mô-đun Python có thể có biến không?

Một trong những điểm mạnh của Python là có nhiều tiện ích bổ sung tích hợp sẵn - hoặc mô-đun - chứa các hàm, lớp và biến hiện có which allow you to do complex tasks in only a few lines of code.

Bạn có thể thay đổi một biến trong Python không?

Một số giá trị trong python có thể sửa đổi được, còn một số thì không . Điều này không có nghĩa là chúng ta không thể thay đổi giá trị của một biến – nhưng nếu một biến chứa giá trị thuộc loại bất biến, chúng ta chỉ có thể gán cho nó một giá trị mới. Chúng tôi không thể thay đổi giá trị hiện tại theo bất kỳ cách nào.

Bạn có thể thay đổi biến toàn cục trong hàm Python không?

Các biến như vậy được cho là có 'phạm vi' cục bộ. Các hàm có thể truy cập các biến toàn cục và sửa đổi chúng. Việc sửa đổi các biến toàn cục trong một hàm được coi là cách lập trình kém . Tốt hơn là gửi một biến dưới dạng tham số [hoặc để nó được trả về trong câu lệnh 'return'].

__ tất cả __ trong Python là gì?

Mục đích của __all__ chỉ đơn giản là để xác định những ký hiệu nào sẽ được nhập như một phần của nhập ký tự đại diện nhắm mục tiêu mô-đun đó . Nếu một biểu tượng có thể nhập được thông qua nhập ký tự đại diện, thì có nghĩa là nó phải được coi là công khai.

Chủ Đề