2010-01-20 28 views
19

Tôi đang mã hóa một chương trình nhỏ về thời gian và hiển thị, theo kiểu đặt hàng, khối lập phương Rubik của tôi. Nhưng Python (3) tiếp tục làm phiền tôi về thời gian được sử dụng trước khi tuyên bố toàn cầu. Nhưng điều kỳ lạ là IT IS đã tuyên bố, ngay trên việc bắt đầu, như times = [] (có, đó là danh sách) và sau đó một lần nữa, về chức năng (đó là nơi anh ta than phiền) là times = [some, weird, list] và "toàn cầu" nó với global times. Đây là mã của tôi, vì vậy bạn có thể phân tích nó như bạn muốn:tên 'thời gian' được sử dụng trước khi khai báo toàn cầu - Nhưng IT IS được khai báo!

import time 

times = [] 

def timeit(): 
    input("Press ENTER to start: ") 
    start_time = time.time() 
    input("Press ENTER to stop: ") 
    end_time = time.time() 
    the_time = round(end_time - start_time, 2) 
    print(str(the_time)) 
    times.append(the_time) 
    global times 
    main() 

def main(): 
    print ("Do you want to...") 
    print ("1. Time your solving") 
    print ("2. See your solvings") 
    dothis = input(":: ") 
    if dothis == "1": 
     timeit() 
    elif dothis == "2": 
     sorte_times = times.sort() 
     sorted_times = sorte_times.reverse() 
     for curr_time in sorted_times: 
      print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time)) 
    else: 
     print ("WTF? Please enter a valid number...") 
     main() 

main() 

Bất kỳ trợ giúp sẽ được rất đánh giá cao như Tôi mới trong thế giới của Python :)

Trả lời

24

Việc kê khai toàn cầu là khi bạn khai báo rằng timesglobal

def timeit(): 
    global times # <- global declaration 
    # ... 

Nếu một biến được khai báo global, nó không thể được sử dụng trước khi tuyên bố.

Trong trường hợp này, tôi không nghĩ bạn cần khai báo vì bạn không chỉ định cho times, chỉ cần sửa đổi nó.

+0

Darn it! Bây giờ, khi tôi chọn tùy chọn 2 để hiển thị cho tôi kết quả của tôi, điều này xuất hiện: AttributeError: đối tượng 'NoneType' không có thuộc tính 'reverse', tham chiếu đến sort_times = sorte_times.reverse() – AntonioPT

+0

Đó là vì 'times.sort()' trả về 'None'. Bạn nên sử dụng 'times.sort(); in lần hoặc 'in được sắp xếp (thời gian)'. –

+0

Cảm ơn! BÂY GIỜ nó hoạt động ^^ – AntonioPT

18

Từ các tài liệu Python:

Names listed in a global statement must not be used in the same code block 
textually preceding that global statement. 

http://docs.python.org/reference/simple_stmts.html#global

Vì vậy, di chuyển global times lên đỉnh của hàm nên được tốt.

Nhưng, bạn nên cố gắng không sử dụng hình cầu trong tình huống này. Cân nhắc sử dụng một lớp học.

+0

+1 cho câu trả lời hoàn chỉnh hơn tôi. – randlet

2

Từ Python Docs

Names listed in a global statement must not be used in the same code block textually preceding that global statement.

1

Chương trình này nên làm việc nhưng có thể không hoạt động chính xác như bạn mong muốn. Xin lưu ý những thay đổi.

import time 

times = [] 

def timeit(): 
    input("Press ENTER to start: ") 
    start_time = time.time() 
    input("Press ENTER to stop: ") 
    end_time = time.time() 
    the_time = round(end_time - start_time, 2) 
    print(str(the_time)) 
    times.append(the_time) 

def main(): 
    while True: 
     print ("Do you want to...") 
     print ("1. Time your solving") 
     print ("2. See your solvings") 
     dothis = input(":: ") 
     if dothis == "1": 
      timeit() 
     elif dothis == "2": 
      sorted_times = sorted(times) 
      sorted_times.reverse() 
      for curr_time in sorted_times: 
       print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time)) 
      break 
     else: 
      print ("WTF? Please enter a valid number...") 

main() 
0

Đối với chương trình chính, bạn có thể khai báo ở trên cùng. Ther sẽ không có cảnh báo. Nhưng, như đã nói, đề cập toàn cầu không hữu ích ở đây. Mỗi biến được đặt trong chương trình chính là trong không gian toàn cầu. Trong các hàm, bạn phải khai báo rằng bạn muốn sử dụng không gian toàn cục cho nó với từ khóa này.

Các vấn đề liên quan