2013-04-10 34 views
6

Tôi có một chức năng mà tôi đang gọi từ mô-đun. Trong hàm, hai biến tôi đang cố gắng truy cập được tạo ra toàn cục. Khi tôi tự chạy mô-đun trong IDLE, tôi vẫn có thể truy cập các biến sau khi hàm kết thúc, như mong đợi. Khi tôi gọi hàm trong mã mà tôi đã nhập mô-đun vào, tôi không thể truy cập các biến.Truy cập các biến toàn cầu từ một hàm trong mô-đun đã nhập

#module to be imported 

def globaltest(): 
    global name 
    global age 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 

Kết quả khi tôi tự chạy nó.

>>> globaltest() 
What is your name? tom 
What is your age? 16 
>>> name 
'tom' 
>>> age 
16 

Và mã sẽ nhập mã.

import name_age 

name_age.globaltest() 

nhưng khi tôi cố gắng truy cập các biến trong mã mà tôi đã nhập.

What is your name? tom 
What is your age? 16 
>>> name 

Traceback (most recent call last): 
File "<pyshell#10>", line 1, in <module> 
name 
NameError: name 'name' is not defined 
>>> 

Làm cách nào để biến toàn cục trong mã mà tôi đã nhập mô-đun hoặc truy cập biến 'tên' hoặc 'tuổi' trong hàm.

Trả lời

1

Chỉ cần thay đổi tuyên bố import của bạn bên dưới:

from name_age import * 

dụ:

In [1]: from name_age import * 
In [2]: print name 
Out[2]: 'tom' 

Ngược lại, nếu bạn muốn sử dụng câu lệnh import name_age, sau đó bạn phải truy cập vào global biến của bạn thông qua tham chiếu tên mô-đun, nghĩa là:

ví dụ:

In [1]: import name_age 
In [2]: print name_age.name 
Out[2]: 'tom' 
+2

khoảng xấu xa như globals. @badathings: _dont_ làm điều này. –

+0

@bruno desthuilliers: ok, cảm ơn. –

+1

Từ [PEP8] (http://legacy.python.org/dev/peps/pep-0008/#imports) * "Cần phải nhập khẩu ký tự đại diện (từ nhập *) vì chúng không rõ tên nào hiện diện trong không gian tên, gây nhầm lẫn cho cả người đọc và nhiều công cụ tự động ... "* – SiHa

3

Câu trả lời đơn giản là "không". "Globals" của Python chỉ là các hình cầu cấp mô-đun, và thậm chí các hình cầu mức mô-đun (các thành phần cấp mô-đun có thể thay đổi được) nên tránh càng nhiều càng tốt, và có rất ít lý do để sử dụng.

Giải pháp đúng là tìm hiểu cách sử dụng đúng các tham số chức năng và giá trị trả lại. Trong trường hợp của bạn một cách tiếp cận đầu tiên sẽ là

#module.py 

def noglobaltest(): 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 
    return name, age 

và sau đó:

sao nhập khẩu
from module import noglobaltest 

name, age = noglobaltest() 
print "name :", name, "age :", age 
Các vấn đề liên quan