5

Khi khai báo hằng số chỉ được sử dụng một hàm, biến đó phải được khai báo cục bộ vì nó chỉ được sử dụng bởi hàm đó, hoặc toàn cầu vì nó không bao giờ thay đổi?(python) Biến của tôi có phải là cục bộ hoặc toàn cầu không? (thực hành tốt nhất)

IE mà là tốt hơn:

CONSTANT = (1, 3, 5, 8) 

##SOME OTHER CODE HERE 

def function1(arg): 
    if arg in CONSTANT: 
     do something 

hay:

def function1(arg): 
    CONSTANT = (1, 3, 5, 8) 
    if arg in CONSTANT: 
     do something 

Tôi biết không có nhiều khác biệt giữa hai, nhưng tôi chỉ muốn biết một trong hai hoạt động được ưa thích vì tôi mới bắt đầu và muốn tạo thói quen tốt.

+1

Câu hỏi hay. :) Nhưng 'CONSTANT' có được sử dụng nhiều lần không? ví dụ cho thấy không, nhưng bạn có thể muốn làm rõ điều này. Nếu bạn sử dụng nó chỉ một lần, hầu như không cần phải đặt tên cho nó, vì vậy bạn có thể muốn cho thấy rằng bạn thực sự có ý định sử dụng nó nhiều lần trong hàm. – EOL

+0

Cá nhân, tôi thích đặt tên những thứ ngay cả khi tôi không nghĩ rằng tôi sẽ sử dụng chúng hai lần, thường là với một bình luận tốt đẹp giải thích những gì liên tục có nghĩa là. Tôi là người đề xuất không sử dụng các chữ trong các biểu thức của tôi, đặc biệt là * nếu chúng được sử dụng nhiều lần. Nhưng trong trường hợp chúng được sử dụng chính xác một lần, tôi có thể thấy nó theo cách của bạn. – acjay

Trả lời

3

Tôi sẽ giữ địa phương. Bạn luôn có thể di chuyển nó toàn cầu trong tương lai nếu bạn cần, hoặc chia sẻ nó giữa các hàm bằng cách làm cho chúng phương thức trong một lớp và biến hằng số thành một biến lớp. Trong những tình huống này, nói chung, càng có nhiều địa phương, tốt hơn và tốt nhất là ẩn thông tin triển khai trong các chức năng của bạn, như trong ví dụ thứ hai của bạn. Nó không tạo ra sự khác biệt lớn ở đây, nhưng khi các dự án của bạn trở nên lớn hơn, khả năng bảo trì và mô đun sẽ được duy trì.

+0

Là hằng số được tạo chỉ một lần trong phiên bản địa phương hoặc một lần cho mỗi cuộc gọi? –

+1

@JoachimIsaksson: Nó sẽ chỉ được tạo một lần, khi tệp được tải. Nó sẽ ở trong ký ức. –

+1

Thậm chí nếu giá trị được tạo ra chỉ một lần, nó được lưu trữ một lần nữa trong biến 'CONSTANT' tại mỗi lần thực hiện (với CPython 2.7.3). Điều này có thể được nhìn thấy thông qua 'dis.dis()'. – EOL

1

tôi sẽ đặt chúng toàn cầu vì:

  1. biến của bạnhằng
  2. Trong Python, toàn cầu phạm vi được gói gọn trong không gian tên mô-đun, có nghĩa là biến của bạn là trong thực tế chỉ toàn cầu bên trong mô-đun.
  3. Nếu bạn gọi hàm của bạn nhiều lần, và đặt hằng số của bạn vào nó, nó sẽ phân bổ lại chúng mỗi khi bạn gọi hàm.
  4. Sau đó, bạn có thể chia sẻ các hằng số giữa các chức năng khác nhau.

Tuy nhiên, nếu bạn chuyển sang Lập trình hướng đối tượng, thì tôi sẽ đặt hằng số làm biến lớp.

+1

Hằng số * không * được phân bổ lại mọi lúc. Chúng được phân bổ một lần và được tham chiếu bằng cách tham chiếu. –

+1

Đối với (1), không chắc tôi nhận được quan điểm của bạn. Đối với (2), chắc chắn, các biến mô-đun không phải là "toàn cầu" giống như các biến được xây dựng, nhưng đó là loại bên cạnh điểm. Các đối số cơ bản giống nhau đối với các biến toàn cục thực sự áp dụng ở bất kỳ mức phạm vi nào ở trên địa phương, chỉ ở mức độ thấp hơn. Mở rộng logic này cho một dự án với hàng trăm hàm và bạn bắt đầu có một chuỗi các biến không thực sự gần với mã thực sự có liên quan đến chúng. Chức năng bắt đầu biến mất, để lại các hằng số không bị gián đoạn của chúng. Với tôi, (3) là tối ưu hóa sớm và (4) là YAGNI. – acjay

0

Tôi sẽ nói rằng điều tốt nhất tùy thuộc vào tình huống.

Nếu thời gian thực hiện không phải là vấn đề, sau đó có hằng số được tải vào một biến mới mỗi lần không lãng phí nhiều thời gian. Điều này có lợi thế rõ ràng hiển thị rõ ràng trong mã của bạn hằng số được sử dụng.

Nếu không, toàn cầu là tốt, nhưng tôi sẽ chỉ làm điều này cho mục đích tối ưu hóa. Nếu tôi nghĩ về nó, việc tối ưu hóa là lý do duy nhất khiến tôi tự hỏi mình cùng một câu hỏi như bạn.

Có thể có lý do chính đáng khác để sử dụng một toàn cầu:

  • nếu người sử dụng chương trình của bạn thường xuyên cần phải thay đổi giá trị của nó trong các mã và bạn không muốn phân tích lập luận chương trình,
  • nếu các chương trình khác cần truy cập vào nó,
  • v.v.

Tóm lại, tôi sẽ nói: làm những gì bạn cảm thấy là tốt nhất, nhưng cố gắng đóng gói mọi thứ càng nhiều càng tốt nơi chúng thuộc về (người dân địa phương được ưa thích hơn là hình cầu).