for循环中的变量是局部变量还是全局变量?

今天写代码时候发现的知识点,对于大神来说可能这不是什么问题,但是对于像我们这样的新手小白而言,发现这个知识点的喜悦难以言表,所以我也同大家分享一下,希望更多的人不要再犯相同的错误!
这是我参照《Python编程:从入门到实践》一书中,绘制收盘价折线图一节里面照抄的程序,有一丢丢改动。

import pygal
import json


# 将数据加载到一个列表中
filename = 'btc_close_2017_request.json'
with open(filename) as f:
    # 将数据存储在btc_data中
    btc_data = json.load(f)
# 打印每一天的信息
for btc_dict in btc_data:
    date = btc_dict['date']
    month = int(btc_dict['month'])
    week = int(btc_dict['week'])
    weekday = btc_dict['weekday']
    close = int(float(btc_dict['close']))
    print("{} is month {} week {},{}.The close price is {} RMB".format(date, month, week, weekday, close))

# 创建5个空列表,分别存储日期和收盘价
dates, months, weeks, weekdays, closes = [], [], [], [], []
for btc_dict in btc_data:

    dates.append(date)
    months.append(month)
    weeks.append(week)
    weekdays.append(weekday)
    closes.append(close)


line_chart = pygal.Line(x_label_rotation=20, show_minor_labels=False)
line_chart.title = '收盘价¥'
line_chart.x_labels = dates
N = 20     # x轴每隔20天显示一次
line_chart.x_labels_major = dates[::N]
line_chart.add('收盘价', closes)
line_chart.render_to_file('收盘价折线图¥.svg')

其中在我写到第二个for循环的时候:

for btc_dict in btc_data:

    dates.append(date)
    months.append(month)
    weeks.append(week)
    weekdays.append(weekday)
    closes.append(close)

我的代码如上,结果pycharm给append括号中的每个变量标黄,我马上意识到这里出了问题,将鼠标置于这些单词之上,pycharm提示“No ‘date’ can be not defined",即这些变量均未定义。我表示很疑惑,在第一个for循环中明明为这些变量赋了值,结果在这里却不能使用。
自己随即进行了查阅,也明白了问题所在:
在for/while等循环内部定义的变量属于局部变量,当for循环结束以后,局部变量就会被销毁,此时如果调用这个变量就会提示变量未定义,就会报错。而变量是指向存储空间的,因此虽然变量消失了,但内存中存储信息的地址还在,也就是说,如果要访问这个地址,必须直接使用这个地址存储的内容。即代码应该这样写:

for btc_dict in btc_data:
    #
    dates.append(btc_dict['date'])
    months.append(int(btc_dict['month']))
    weeks.append(int(btc_dict['week']))
    weekdays.append(btc_dict['weekday'])
    closes.append(int(float(btc_dict['close'])))

如果想在循环外部调用这个局部变量,那么你就需要扩大它的作用范围,必须在变量名称前面加上global关键字,把它变成一个全局变量,这样即使for循环结束了,这个变量仍然有效。
而在实际的编程操作中,因为全局变量会被其他函数读取到,存在一定的风险,不大建议这样做。
希望对大家有所帮助!

你可能感兴趣的:(for循环中的变量是局部变量还是全局变量?)