Heim  >  Fragen und Antworten  >  Hauptteil

Python-Anfängerfrage zu lokalen Variablen und globalen Variablen

Erster Code:

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums = [11,22,33,44,55,999]
    print(nums)

nums_chang() # 打印出来是[11,22,33,44,55,999]
print(nums)  # 打印出来是[11,22,33,44,55]

Laufergebnis:

Zweiter Code:

# -*- coding:gb2312 -*-
nums = [11,22,33,44,55]

def nums_chang():
    nums.append(999)  # 打印出来是[11,22,33,44,55,999]
    print(nums)       # 打印出来是[11,22,33,44,55,999]

nums_chang()
print(nums)

Laufergebnis:

Meine Frage ist:
Warum sind die beiden vom ersten Code gedruckten Ergebnisse unterschiedlich, die vom zweiten Code gedruckten Ergebnisse jedoch gleich? Insbesondere im zweiten Teil des Codes: Warum kann der Anhängebefehl in der Funktion die globalen Variablen außerhalb ändern? Im ersten Codeteil wird die Liste neu definiert, aber die externen globalen Variablen können nicht geändert werden? Was ist hier der Grund?

学习ing学习ing2686 Tage vor1061

Antworte allen(3)Ich werde antworten

  • 仅有的幸福

    仅有的幸福2017-06-12 09:26:56

    看了下采纳答案,我觉得还是没说到点子上面。
    首先nums变量被定义为了全局变量,也就说在这个".py"文件里面,所有类、函数都可以使用它。但是所有变量也是一个对象,而对象分为可变和不可变。而列表是可变对象,也就是说可以变更。那么什么是可变对象?就是那些可以对对象操作,而不影响在内存中的生灭。入x="234",如果你再赋值,x="111"。其实两个x已经是两个对象了,只是覆盖了而已,即x = x + "123",x也是一个新对象。

    如果是列表,x = [1,2,3],现在对它操作,x.remove(1),那么x对象还是x对象,只是对象的值有改变

    第一段代码:就是重新赋值,在不同的作用域,nums赋值了一遍,这样全局变量nums和nums_chang函数里面的nums变量就不再是一个对象,他们是不同的,因此你打印的时候出现了不同的值,此时nums_chang函数里面的nums变量已经是一个局部变量,只给这个函数使用

    第二段代码:nums是个列表,是可变对象,因此对列表的操作,不影响这个对象,因此这个对象还是全局中的那个,函数和外面都是用的全局变量,因此你修改了之后,全局变量的值也跟着修改了

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-06-12 09:26:56

    第一: 关于作用域的问题, 可以先参考下我的一篇文章: Python: 作用域(scope) 和 LEGB, 可以先对变量的查找有个基本的认识,然后我们能够看到, 因为有赋值语句, 所以nums只会只会从局部作用域查找,并不会和全局作用域有关系

    第二: 在第一的基础上, 我们可以看到nums.append(999)中的nums是从全局作用域找到的, 又因为用的是append方法, 这方法是直接用于源列表本身, 所以你看到全局的nums也被更新了

    Antwort
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-12 09:26:56

    函数在自己的作用域找不到变量,就回去上一级作用域找,你的第二个就是这样来的。
    第一个的话,和明显你赋值了呀

    Antwort
    0
  • StornierenAntwort