Tên biến Python

Trong Python, biến là tên được đặt cho một giá trị, để sau này dễ dàng tham chiếu một giá trị. Nói cách khác, một biến trỏ đến một đối tượng. Một giá trị bằng chữ được gán cho một biến bằng cách sử dụng toán tử

>>> num
10
4 trong đó phía bên trái phải là tên của một biến và phía bên phải phải là một giá trị. Sau đây gán tên cho một giá trị số nguyên

>>> num=10

Bây giờ, bạn có thể tham khảo 10 bằng cách sử dụng tên biến num, như hình bên dưới

>>> num
10

Sử dụng hàm print() tích hợp để hiển thị giá trị của một biến trên REPL

>>> print(num) #display value
10
>>> print(num * 2) # multiply and display result
20

Biến trong Python là đối tượng. Sử dụng hàm type() để lấy tên lớp của một đối tượng. Ví dụ: phần sau hiển thị tên lớp của biến

>>> num
10
5

>>> type(num)
<class 'int'>

Loại của

>>> num
10
5 là int. Một đối tượng của lớp int chứa một số nguyên bằng chữ
>>> num
10
7

Tất cả các biến thực sự là một đối tượng của một lớp tùy thuộc vào giá trị

________số 8_______

Không giống như các ngôn ngữ lập trình khác như C# hay Java, Python là ngôn ngữ kiểu động, nghĩa là bạn không cần khai báo kiểu của biến. Loại sẽ được gán động dựa trên giá trị được gán

>>> x=100
>>> type(x)
<class 'int'>

>>> x='Hello World'
>>> type(a)
<class 'string'>

Các hoạt động khác nhau có thể được thực hiện trên các biến bằng cách sử dụng các toán tử khác nhau dựa trên loại biến. Ví dụ: toán tử

>>> num
10
8 tính tổng hai biến int, trong khi nó nối hai biến kiểu chuỗi, như minh họa bên dưới

>>> x=5
>>> y=5
>>> x+y
10
>>> x='Hello '
>>> y='World'
>>> x+y
'Hello World'

Nhận dạng đối tượng

Mỗi đối tượng trong Python có một id. Đó là địa chỉ của đối tượng trong bộ nhớ được biểu thị bằng một giá trị số nguyên. Hàm

>>> num
10
9 trả về id của đối tượng được chỉ định nơi nó được lưu trữ, như hình bên dưới

>>> x=100
>>> id(x)
8791062077568
>>> greet='Hello'
>>> id(greet)
4521652332

Một id sẽ được thay đổi nếu một biến thay đổi thành giá trị khác

>>> x=100
>>> id(x)
879106207
>>> x='Hello'
>>> id(x)
2354658

Ví dụ, nhiều biến được gán cho cùng một giá trị bằng chữ sẽ có cùng id

>>> x=100
>>> id(x)
879106207
>>> y=x
>>> id(y)
879106207
>>> z=100
>>> id(z)
879106207

Do đó, Python tối ưu hóa việc sử dụng bộ nhớ bằng cách không tạo các đối tượng riêng biệt nếu chúng trỏ đến cùng một giá trị

Bài tập nhiều biến

Bạn có thể khai báo nhiều biến và gán giá trị cho từng biến trong một câu lệnh, như hình bên dưới

>>> num
10
0

Trong ví dụ trên, giá trị int đầu tiên

>>> num
10
7 sẽ được gán cho biến đầu tiên x, giá trị thứ hai cho biến thứ hai y và giá trị thứ ba cho biến thứ ba z. Việc gán giá trị cho các biến phải theo thứ tự như đã khai báo

Bạn cũng có thể khai báo các loại giá trị khác nhau cho các biến trong một câu lệnh, như hình bên dưới

>>> num
10
1

Gán một giá trị cho từng biến riêng lẻ được phân tách bằng dấu phẩy sẽ gây ra lỗi cú pháp, như được hiển thị bên dưới

Tôi là tác giả của gói python-varname. Vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc bạn có thể gửi vấn đề trên Github

Câu trả lời dài

Nó thậm chí có thể?

Có và không

Chúng tôi đang truy xuất tên biến trong thời gian chạy, vì vậy chúng tôi cần gọi một hàm để cho phép chúng tôi truy cập các khung trước đó để truy xuất tên biến. Đó là lý do tại sao chúng ta cần một Wrapper ở đó. Trong chức năng đó, khi chạy, chúng tôi đang phân tích mã nguồn/các nút AST trong các khung trước đó để lấy tên biến chính xác

Tuy nhiên, các nút mã nguồn/AST trong các khung trước đó không phải lúc nào cũng có sẵn hoặc chúng có thể bị sửa đổi bởi các môi trường khác (e. g. tuyên bố assert của pytest). Một ví dụ đơn giản là các mã chạy qua

n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
0. Mặc dù chúng tôi vẫn có thể truy xuất một số thông tin từ mã byte, nhưng nó cần quá nhiều nỗ lực và nó cũng dễ bị lỗi

Làm thế nào để làm nó?

Trước hết, chúng ta cần xác định khung nào đưa ra biến. Nó không phải lúc nào cũng chỉ đơn giản là khung hình trước đó. Ví dụ: chúng ta có thể có một trình bao bọc khác cho hàm

from varname import varname

def func():
  return varname()

def wrapped():
  return func()

x = wrapped()

Trong ví dụ trên, chúng ta phải bỏ qua khung bên trong

n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
1 để đến khung bên phải
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
2 để có thể xác định vị trí của
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
3. Các đối số
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
4 và
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
5 của
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
6 cho phép chúng tôi bỏ qua một số khung trung gian này. Xem thêm chi tiết trong tệp README và tài liệu API của gói

Sau đó, chúng ta cần phân tích cú pháp nút AST để xác định vị trí biến được gán giá trị (gọi hàm) cho. Nó không phải lúc nào cũng chỉ là một nhiệm vụ đơn giản. Đôi khi có thể có các nút AST phức tạp, ví dụ,

n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
7. Chúng ta cần xác định phép gán chính xác bằng cách duyệt qua cây AST

Làm thế nào là nó đáng tin cậy?

Khi chúng tôi xác định nút gán, nó đáng tin cậy

n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
6 tất cả phụ thuộc vào gói
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
9 để tìm kiếm nút. Phát hiện thực thi nút được đảm bảo là chính xác (xem thêm)

Nó hoạt động một phần với các môi trường áp dụng các phép thuật AST khác, bao gồm pytest, ipython, macropy, Birdseye, reticulate với R, v.v. Cả thực thi và varname đều không hoạt động 100% với các môi trường đó

Chúng ta có cần một gói để làm điều đó?

Vâng, có và không, một lần nữa

Nếu kịch bản của bạn đơn giản, thì mã do @juan Isaza hoặc @scohe001 cung cấp có lẽ đủ để bạn làm việc với trường hợp một biến được xác định tại khung trực tiếp trước đó và nút AST là một phép gán đơn giản. Bạn chỉ cần quay lại một khung và lấy thông tin ở đó

Tuy nhiên, nếu kịch bản trở nên phức tạp hoặc chúng ta cần áp dụng các kịch bản ứng dụng khác nhau, bạn có thể cần một gói như python-varname, để xử lý chúng. Những kịch bản này có thể bao gồm để

  1. trình bày các thông báo thân thiện hơn khi không có mã nguồn hoặc không thể truy cập các nút AST
  2. bỏ qua các khung trung gian (cho phép chức năng được gói hoặc gọi trong các khung trung gian khác)
  3. tự động bỏ qua các cuộc gọi từ các chức năng hoặc thư viện tích hợp. Ví dụ.
    from varname import varname
    
    def func():
      return varname()
    
    def wrapped():
      return func()
    
    x = wrapped()
    
    1
  4. truy xuất nhiều tên biến ở phía bên trái của bài tập
  5. vân vân

Còn về

from varname import varname

def func():
  return varname()

def wrapped():
  return func()

x = wrapped()
2 thì sao?

Giống như câu trả lời được cung cấp bởi @Aivar Paalberg. Nó chắc chắn là nhanh chóng và đáng tin cậy. Tuy nhiên, nó không ở thời gian chạy, nghĩa là bạn phải biết nó là

from varname import varname

def func():
  return varname()

def wrapped():
  return func()

x = wrapped()
3 trước khi in tên ra. Nhưng với
n_jobs = Wrapper() 
users = Wrapper() 
queues = Wrapper() 
priorities = Wrapper() 

list_of_dicts = [n_jobs, users, queues, priorities]
columns = [d.name for d in list_of_dicts]
# ['n_jobs', 'users', 'queues', 'priorities']
# REMEMBER that you have to access the  by d.value
6, bạn không cần biết rằng biến đó đang đến

from varname import varname

def func():
  return varname()

# In external uses
x = func() # 'x'
y = func() # 'y'

Cuối cùng

python-varname không chỉ có thể phát hiện tên biến từ một phép gán, mà còn

  • Truy xuất tên biến trực tiếp, sử dụng
    from varname import varname
    
    def func():
      return varname()
    
    def wrapped():
      return func()
    
    x = wrapped()
    
    6
  • Phát hiện tên thuộc tính ngay lập tức tiếp theo, sử dụng
    from varname import varname
    
    def func():
      return varname()
    
    def wrapped():
      return func()
    
    x = wrapped()
    
    7
  • Tìm nạp tên/nguồn đối số được chuyển đến một hàm bằng cách sử dụng
    from varname import varname
    
    def func():
      return varname()
    
    def wrapped():
      return func()
    
    x = wrapped()
    
    8

Đọc thêm từ tài liệu của nó

Tuy nhiên, lời cuối cùng tôi muốn nói là hãy cố gắng tránh sử dụng nó bất cứ khi nào bạn có thể.

Bởi vì bạn không thể đảm bảo rằng mã máy khách sẽ chạy trong môi trường có sẵn nút nguồn hoặc nút AST có thể truy cập được. Và tất nhiên, sẽ tốn tài nguyên để phân tích mã nguồn, xác định môi trường, truy xuất các nút AST và đánh giá chúng khi cần

Bạn có thể đặt tên biến bất kỳ thứ gì trong Python không?

Python cho phép bạn đặt tên biến theo ý thích của mình, miễn là tên đó tuân theo các quy tắc này . Tên biến có thể chứa các chữ cái, chữ số (0-9) hoặc ký tự gạch dưới _. Tên biến phải bắt đầu bằng một chữ cái từ A-Z hoặc ký tự gạch dưới _. Chữ thường hoặc chữ in hoa đều được chấp nhận.

4 loại biến trong Python là gì?

Các loại biến Python .
số
Sợi dây
Tuple

Tên biến tốt Python là gì?

Chọn tên biến “tốt” .
Hãy rõ ràng và ngắn gọn
Được viết bằng tiếng Anh. .
Không chứa ký tự đặc biệt. .
Không xung đột với bất kỳ từ khóa Python nào, chẳng hạn như for , True , False và , if , or other

Đó là một ví dụ về một tên biến?

Sau đây là các ví dụ về tên biến hợp lệ. tuổi, giới tính, x25, age_of_hh_head .