Hướng dẫn how to initialize a variable only once in python - cách khởi tạo một biến chỉ một lần trong python

Tôi muốn thực hiện phù hợp với dữ liệu chuỗi thời gian của mình với dữ liệu meta từ một tệp nhất định.

Trong mã của tôi, hàm chính gọi hàm "create_match ()" cứ sau 1 phút. Bên trong "created_match (), có chức năng" list_from_file () "để đọc dữ liệu từ tệp và lưu trữ trong danh sách để thực hiện khớp.

Vấn đề là mã của tôi không hiệu quả vì cứ sau 1 phút, nó đọc tệp và viết lại trong cùng một danh sách. Tôi chỉ muốn đọc tệp một lần (để khởi tạo danh sách chỉ một lần) và sau đó bỏ qua chức năng "list_from_file ()". Tôi không muốn chỉ chuyển tác vụ này sang chức năng chính và truyền danh sách thông qua chức năng.

Python có biến đặc biệt như biến tĩnh trong lập trình C.

Đã hỏi ngày 9 tháng 12 năm 2015 lúc 2:02Dec 9, 2015 at 2:02

Hướng dẫn how to initialize a variable only once in python - cách khởi tạo một biến chỉ một lần trong python

2

Python không có khai báo biến tĩnh; Tuy nhiên, có một số mẫu lập trình khá chuẩn trong Python để làm điều gì đó tương tự. Cách dễ nhất là chỉ sử dụng một biến toàn cầu.

Biến toàn cầu

Xác định một biến toàn cầu và kiểm tra nó trước khi chạy chức năng khởi tạo của bạn. Nếu biến toàn cầu đã được đặt (tức là danh sách bạn đang đọc), chỉ cần trả lại chúng.

CACHE = None

def function():
    global CACHE
    if CACHE is None:
        CACHE = initialize_function()
    return CACHE

Đã trả lời ngày 9 tháng 12 năm 2015 lúc 2:14Dec 9, 2015 at 2:14

Brendan Abelbrendan AbelBrendan Abel

33.5K14 Huy hiệu vàng86 Huy hiệu bạc113 Huy hiệu đồng14 gold badges86 silver badges113 bronze badges

Bạn có thể sử dụng một lớp:

class Match (object):
    def __init__(self):
        self.data = list_from_file()
    def create_match(self):
        # do something with `self.data` here

Tạo một ví dụ:

match = Match()

Điều này gọi list_from_file().

Bây giờ, bạn có thể gọi create_match() nhiều lần với quyền truy cập vào self.data

import time
for x in range(10):
    match.create_match()
    time.sleep(60)

Đã trả lời ngày 9 tháng 12 năm 2015 lúc 2:19Dec 9, 2015 at 2:19

Mike Müllermike MüllerMike Müller

79,7K18 Huy hiệu vàng157 Huy hiệu bạc159 Huy hiệu đồng18 gold badges157 silver badges159 bronze badges

Có rất nhiều cách.

Bạn có thể tạo một phần biến của một lớp - không phải là thành viên của đối tượng, mà là chính lớp. Nó được khởi tạo khi lớp được xác định.

Tương tự, bạn có thể đặt một biến ở cấp độ bên ngoài của một mô -đun. Nó sẽ thuộc về mô -đun và sẽ được khởi tạo khi mô -đun được nhập lần đầu tiên.

Cuối cùng, việc hack xác định một đối tượng là tham số mặc định cho một hàm. Biến sẽ được khởi tạo khi hàm được xác định và sẽ thuộc về hàm. Bạn sẽ chỉ có thể truy cập nó với tên tham số và nó có thể bị người gọi ghi đè.

Đã trả lời ngày 9 tháng 12 năm 2015 lúc 2:15Dec 9, 2015 at 2:15

Mark Ransommark RansomMark Ransom

292K40 Huy hiệu vàng384 Huy hiệu bạc610 Huy hiệu Đồng40 gold badges384 silver badges610 bronze badges

Câu trả lời hiện có từ @polosson là chính xác, tuy nhiên tôi hơi thiên vị so với toàn cầu vì tôi đã phải gỡ lỗi mã người khác với nhiều thế giới - nó có thể trở nên khó khăn, nếu mã trở nên phức tạp và có nhiều hơn 2-3 trong số chúng được sử dụng trên nhiều chức năng. Thật là một nỗi đau khi theo dõi chúng, quên thêm từ khóa global, nó có thể thất bại theo một cách không rõ ràng.

Lưu trữ trong một từ điển toàn cầu

Đây là một giải pháp thay thế, mà tôi thích trong một số trường hợp.

# store all runtime variables here.
runtime = {}
runtime["hmd"] = None

def poll():
    # declare hmd as global so that the function has (write) access to the global var.
    if runtime["hmd"] is None:
        runtime["hmd"] = ctypes.WinDLL("C:\\Program Files\\Blender Foundation\\Blender\\2.68\\scripts\\addons\\game_engine_rift\\openhmd.dll")

Bạn có thể lưu trữ trạng thái thời gian chạy trong từ điển và nó có một số lợi thế mà bạn có thể dễ dàng ____10, ________ 11 ..., v.v. và chuyển nó cho các mô -đun khác nếu cuối cùng bạn sẽ chia mã trên các tệp.

Bởi vì từ điển, bản thân của nó không bao giờ được gán lại, bạn không phải định nghĩa nó là toàn cầu.

Lưu trữ trong chức năng

Một mẹo khác, là bạn có thể lưu trữ biến trong hàm (và tránh sử dụng Globals)

Lưu ý rằng đây không phải là không gian tên cục bộ, đó là lý do tại sao nó phải được truy cập như một thuộc tính của hàm, ngay cả khi bên trong cơ thể chức năng.not the functions local namespace, which is why it has to be accessed as an attribute of the function, even when inside the function body.

def poll():
    # declare hmd as global so that the function has (write) access to the global var.
    if poll.hmd is None:
        poll.hmd = ctypes.WinDLL("C:\\Program Files\\Blender Foundation\\Blender\\2.68\\scripts\\addons\\game_engine_rift\\openhmd.dll")
poll.hmd = None

Đôi khi tôi sử dụng điều này cho các biến toàn cầu mà chỉ có chức năng truy cập.

Để biết thêm thông tin về các thuộc tính chức năng Xem: Q: Thuộc tính chức năng Python - Sử dụng và lạm dụng
Q: Python function attributes - uses and abuses

Làm thế nào để bạn khởi tạo một biến chỉ một lần?

Làm cho biến riêng tư và đặt giá trị thành nó bằng phương thức setter sao cho nếu bạn cố gắng gọi nó lần thứ hai, nó sẽ đặt giá trị trước đó hoặc ném một ngoại lệ. such that if you try to invoke it for the second time it should set the previous value or throw an exception.

Làm thế nào để bạn khởi tạo một biến trong Python?

Python không có lệnh để khai báo một biến ...
Chỉ đặt tên cho biến ..
Gán giá trị cần thiết cho nó ..
Kiểu dữ liệu của biến sẽ được xác định tự động từ giá trị được gán, chúng tôi không cần xác định rõ ràng ..

Tôi có thể khai báo biến mà không cần khởi tạo Python không?

Câu trả lời là: "Có! Chúng ta có thể khai báo loại biến như vậy".Để khai báo một biến mà không có bất kỳ biến nào, chỉ cần gán không.To declare a variable without any variable, just assign None.

Làm thế nào để bạn khởi tạo một biến trong init Python?

Tất cả các lớp nên có một phương thức __init __ ().Khi bạn tạo một đối tượng mới của lớp, Python sẽ tự động gọi __init __ () ngay lập tức để khởi tạo đối tượng mới.Nhưng trên thực tế, cách tiêu chuẩn để khởi tạo các giá trị của một đối tượng khi tạo các đối tượng là sử dụng phương thức __init __ () trong lớp.use __init__( ) method in class.