首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么python字符串不能从类内部更改全局变量?

Python中字符串是不可变(immutable)的数据类型,也就是说一旦字符串被创建,就不能被修改。当我们在一个类的内部尝试去修改一个全局变量时,如果这个全局变量是一个字符串,Python会创建一个新的字符串对象来存储修改后的值,并将这个新的字符串对象赋值给类内部的变量。但是,这并不会改变全局变量的值,因为全局变量仍然指向原来的字符串对象。

这种行为是由于字符串的不可变性所导致的。为了更好地理解这个问题,我们可以看一个简单的示例:

代码语言:txt
复制
global_var = "Hello"

class MyClass:
    def change_global(self):
        global_var = "World"

obj = MyClass()
obj.change_global()
print(global_var)

这段代码中,我们定义了一个全局变量 global_var,然后在类 MyClass 的方法 change_global 中尝试修改这个全局变量。然后我们打印全局变量的值。

预期的输出应该是 "World",但实际上输出的是 "Hello"。这是因为在 change_global 方法中,我们创建了一个新的字符串对象 "World" 并将其赋值给了类内部的变量 global_var,但是这并不会影响到全局变量 global_var 的值。

要解决这个问题,可以使用 global 关键字来声明在类内部使用的是全局变量,并且需要在方法中使用 global 关键字来明确指示我们要修改的是全局变量,而不是创建一个新的局部变量。

以下是修改后的示例代码:

代码语言:txt
复制
global_var = "Hello"

class MyClass:
    def change_global(self):
        global global_var
        global_var = "World"

obj = MyClass()
obj.change_global()
print(global_var)

现在,输出将会是 "World",因为我们使用 global 关键字明确指示了要修改的是全局变量。

总结来说,Python中字符串不能从类内部直接更改全局变量的原因是字符串的不可变性。但可以通过使用 global 关键字来声明并修改全局变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python 变量和作用域

变量作用域 python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。...python的作用域一共有4种,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Global) 全局作用域 B (Built-in) 内建作用域 以 L...如果函数内部,一定要改全局变量呢?...,推荐这么做 def change_name():     global name     name = "wang" change_name() print(name) 执行输出 wang 为什么推荐这么做...只有字符串,整数这种类型时,不能在函数内部更改全局变量。 稍微复杂一点的,比如列表,字典,集合,,都是可以在函数内部更改的。

71030

Python3 编程笔记

xrange函数 17 内部模块 deque 18 用 map 高阶函数返回列表指定元素 19 双冒号 :: 用法 20 获取python解释器路径 21 easydict 模块使用 22 file...global 关键字作用 根据一个变量起作用的范围不同,可以将变量分为全局变量与局部变量: 全局变量在全局范围内起作用,局部变量在一个函数内部起作用 一般全局变量是不可以更改的,但是在 python 中...,可以使用 global 关键字进行更改更改后的全局变量将以新的值在全局范围内继续起作用。...global关键字:声明此变量为全局变量 在一个函数中,对全局变量进行修改的时候,是否需要使用 global 进行说明要看是否对全局变量的执行指向进行了修改如果修改了执行指向,即让全局变量指向了一个新的地方...global语句使用 python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。

86510
  • 深入了解Python 变量作用域

    只有当变量在Module(模块)、Class()、def(函数)中定义的时候,才会有作用域的概念。 1....Python程序会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有n的定义和赋值,所以报错 # y = n...Python虽然是一个静态作用域语言,但变量名查找是动态发生的,直到在程序运行时,才会发现作用域方面的问题, 3. list,dict等复合变量里面的值都可以引用更改 def counter():...Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。...所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。 注意:如果需要在函数内部全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量

    1.1K21

    搜罗的面试题总结(一)

    strlen是C语言中的库函数,用来计算字符串长度,直到空结束字符,但不包括空结束字符。...在C++程序中调用被C编译器编译后的函数,为什么要加 extern “C” ? 告诉编译器该部分语法按照C语言语法编译 8....一个有基内部有一个其他的成员对象,请问该子类、基、和内部类的成员对象的构造函数执行顺序? 先调用基构造函数、再调用其他成员构造函数、最后调用自己的构造函数。 先构造、后析构。 9....2、堆区(heap) — 一般由程序员分配释放, 若程序员释放,程序结束时可能由OS回收 。注意它与数据结构中堆是两回事,分配方式倒是类似于链表。...3、全局区(静态区)(static)—,全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 未初始化全局变量和未初始化静态变量在相邻另一块区域。- 程序结束后由系统释放。

    64410

    PEP8-Python代码规范样式编写指南摘录

    注释块注释内镶注释文档字符串命名约定首要原则描述性:命名样式说明性:命名约定避免使用的名称ASCII兼容性软件包和模块名称名类型变量名异常名称全局变量名函数和变量名函数和方法参数方法名称和实例变量常量继承设计...空行 用两个空行环绕顶级函数和定义。 内部的方法定义由单个空白行环绕。 额外的空白行可以用于分隔相关的功能组。一堆相关的单线之间可以省略空白行。...在Python中,单引号字符串和双引号字符串是相同的。...公共属性是您期望中不相关的客户端使用的属性,并承诺避免向后兼容的更改。非公开属性是指不打算由第三方使用的属性;您不保证非公开属性不会更改甚至被删除。...如果您的打算被子类化,并且您具有希望子类使用的属性,请考虑使用双下划线开头并且没有下划线结尾的样式来命名它们。这将调用Python的名称修改算法,其中将的名称修改为属性名称。

    1.6K10

    python3 学习笔记

    如今又要用 python 来写一个生成 xlsx 的工具, 就又需要查看手册了, 至于为什么不用 go 写? 那是因为 go 的库兼容永中....# -*- coding: UTF-8 -*- 或者 #coding=utf-8 来指定 python 有独一无二的注释方式: 文档字符串, 所以注释尽量用文档字符串("""xxxx""") 如果一个不从其他继承...是动态语言, 变量的类型固定, 根据值的类型而决定, 所以不用显示的声明变量, 用的时候直接赋值即可,如下: a = 1; // 此时是整型 print(a); a = 'hello'; // 此时又为字符串类型...a = 1 def test(): # 若下面这行注释掉, 则下面的 a 是局部变量, 'Global' 处的输出还是全局变量 1 # 若下面这行取消注释, 则下面的 a 是全局变量...: 只能在内部方法中访问的成员 受保护成员: 只能由本类或子类访问的成员 公有成员: 全局的, 内部, 外部和子类都能访问的成员 方法: 中定义的函数 方法重写: 如果从父继承的方法不满足需求

    66610

    27 个问题,告诉你Python为什么这么设计

    CPython退出时为什么释放所有内存? 为什么有单独的元组和列表数据类型? 列表是如何在CPython中实现的? 字典是如何在CPython中实现的? 为什么字典key必须是不可变的?...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 为什么必须在方法定义和调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免C堆栈。 为什么lambda表达式包含语句?...CPython退出时为什么释放所有内存? 当Python退出时,从全局命名空间或Python模块引用的对象并不总是被释放。

    6.7K11

    每天 3 分钟,小闫带你学 Python(二十二)

    答:函数内部定义同名局部变量之后,会使用局部变量的值,但是并没有修改全局变量,可以理解为在函数内部定义了一个和全局变量同名的局部变量,局部变量优先级比较高而已,即先使用局部变量。...2.2 修改全局变量 全局变量的值在函数内部也是可以进行修改的,但是需要特殊操作。好比生活中,公共汽车站牌是一个全局变量,你我都是函数,我们可以随意更改站牌位置吗?...为什么呢?...,都是相同的“相加赋值”,结果为什么不同呢?...= [1, 2, 3] function(b) print(b) # 输出结果为 [1, 2, 3, 1, 2, 3] ,发现原数据被修改 1.可变类型有:列表、字典、集合 2.不可变类型有:数字、字符串

    47420

    Python3使用过程中需要注意的点

    continue        结束本次循环,继续下一次循环,结束循环体。...) 更改全局变量 name = "zhao" def change_name(): global name #声明一个全局变量 name = "zhaoruofei" print..."当前name", name) 匿名函数 常与其他函数连用 res = map(lambda x:x**2,[1,2,3,4]) for i in res: print(i) 递归函数 l  函数内部调用自身...实现单例模式的方式 给添加装饰器 导入模块 根据python解释器当import一个py文件时都会把该文件编码为pyc流,当再次import就直接读取pyc文件,除非py文件内容有所更改才会再次编码的原理...魔术方法可以理解为python代码和解释器的一种规约,python在实例化时首先调用__new__去创建一个对象再__init__去初始化这个new出来的对象,所以__new__这个方法必须返回一个对象

    1.6K50

    Python语言常用的49个基本概念及含义

    字符串前面加字母r或R表示原始字符串,加字母f或F表示对其中的占位符进行格式化,可以在一个字符串前面同时加字母r和f(区分大小写)。...expression):语法形式为(expr for var in iterable if condition),计算结果为一个生成器对象,生成器对象属于迭代器对象,具有惰性求值特点,不支持下标、切片,只能从前向后逐个访问其中的元素...全局变量(global variable):如果一个变量的第一次赋值语句不在任何函数内部,那么它是全局变量。另外,在函数内部可以使用关键字global直接声明一个变量为全局变量。...在Python中,变量自定义开始,直到当前函数或文件结束,都是可以使用的,除非被声明为全局变量或者被更小的作用域内同名变量暂时隐藏。...模块(module):包含若干函数、、常量的Python程序文件。 包(package):包含若干Python程序文件的文件夹,且其中有一个文件名为__init__.py。

    2.7K21

    27 个问题,告诉你Python为什么这么设计?

    要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 为什么Python字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 为什么必须在方法定义和调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免C堆栈。 为什么lambda表达式包含语句?...CPython退出时为什么释放所有内存? 当Python退出时,从全局命名空间或Python模块引用的对象并不总是被释放。

    3.1K20

    Python官方二十七问,你知道个啥?

    要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案 2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免 C 堆栈。 12. 为什么 lambda 表达式包含语句?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。

    2.5K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案 2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免 C 堆栈。 12. 为什么 lambda 表达式包含语句?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。

    2.6K20

    干货 | 27 个问题,告诉你 Python 为什么如此设计?

    要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案 2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免 C 堆栈。 12. 为什么 lambda 表达式包含语句?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。

    2.7K10

    Python 核心设计理念27个问题及解答

    要获得更完整的解释,请参阅 Python 教程中的 浮点算术 一章。 04. 为什么 Python 字符串是不可变的? 有几个优点。...任何动作都不会将值 8 更改为其他值,在 Python 中,任何动作都不会将字符串 "8" 更改为其他值。 05. 为什么必须在方法定义和调用中显式使用“self”?...在 C++ 中,可以通过缺少局部变量声明来判断(假设全局变量很少见或容易识别) —— 但是在 Python 中没有局部变量声明,所以必须查找定义才能确定。...答案 2:幸运的是, Stackless Python 有一个完全重新设计的解释器循环,可以避免 C 堆栈。 12. 为什么 lambda 表达式包含语句?...CPython 退出时为什么释放所有内存? 当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。

    3.3K21

    Python变量类型及变量引用

    二、变量的类型        Python 包含像 int 这样的简单类型 —— 只有对象类型, 如果 Python 中需要整数值,将整数赋值给相应变量(如i = 100 )即可。...代码类型 —— 封装 Python 程序的元素。 内部类型 —— 程序执行期间使用的类型。...此外,对象还分两:一是可修改的,一是不可修改的。...为什么?因为对象不可变。那什么可变?变量的引用是可变的! 好,那么自然剩下的就是可变的对象了,上面的实验亦可以很容易的证实字典、列表、集合和实例等对象是可变的。那么,这意味着什么呢?...如果一个函数里面使用了一个变量,那么 Python 会先看看有没有对应的本地变量,如果没有找到,但找到一个全局变量,那么 Python 会把那个全局变量的引用赋给一个新的本地变量。

    2.5K30

    Python入门之函数和变量

    更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。...可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。...python参数传递 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。...i_num = 2 # 局部变量 注:Python 中只有模块(module),(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else...全局变量和局部变量 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

    14210
    领券