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

为什么这个python赋值不能像预期的那样工作呢?

Python中的赋值操作是将一个值或对象绑定到一个变量上。当我们执行赋值操作时,实际上是将变量指向了一个内存地址,而不是直接复制值。

当我们对一个变量进行赋值时,如果该变量是一个可变对象(如列表、字典等),那么对该变量的修改会影响到所有指向同一内存地址的变量。这是因为它们实际上指向了同一个对象。

然而,如果我们对一个变量进行赋值,而该变量是一个不可变对象(如整数、字符串等),那么对该变量的修改实际上会创建一个新的对象,并将变量指向这个新的对象。这是因为不可变对象在Python中是无法被修改的。

下面是一个示例:

代码语言:python
复制
a = 10
b = a
a = 20

print(b)  # 输出:10

在这个示例中,我们首先将变量a赋值为10,然后将变量b赋值为a。接着,我们将变量a重新赋值为20。由于整数是不可变对象,所以对变量a的重新赋值实际上创建了一个新的整数对象,并将变量a指向这个新对象。因此,变量b仍然指向原来的整数对象,其值为10。

需要注意的是,这种行为只适用于不可变对象。对于可变对象,如列表或字典,对其进行修改会影响到所有指向同一对象的变量。

希望这个解答对您有所帮助。如果您对云计算或其他相关主题有更多问题,欢迎继续提问。

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

相关·内容

Python最令人困惑操作符

这是Python中两种不同类型可迭代一维数组,它们之间只有一个键差。元组是不可变结构,这意味着一旦定义,元组就不能被更改。列表当然是可变,它包含了append()这样方法。...然而,Python仍然具有试图改变不可变类型时可能会出现抛出。考虑到这个功能,我们可以预期下面的代码会显示一个错误,说明元组是不可变。...letters[0] += "Q" 正如预期那样,我们得到了另一个类型错误,因为元组一旦创建就不能更改。但是,只有在对数据结构调用操作符后才会抛出此类型错误。...这就是为什么正等号这么棒部分原因! 仔细看看 04 现在我们已经知道了加号等于运算符有多奇怪,为了更好地理解其用法中怪异之处,让我们来看看该运算符实际上是如何工作。...当然,这将是这个操作符上相同函数Python实现一个更粗略版本。代码看起来就像我们期望那样: def plusequals(num1, num2): total = num1.

62610

python从入门到放弃(二)

a,但是我们在后面加上了等号,现在a就等于1了,a就是变量,这个让a=1过程就是赋值 那可能有人可能会问,为什么要加变量,这段代码中效果不明显,下面做个示范 //现在我们要实现输出一个计算题结果 print...c,在用print打印出c结果即可 变量名命名规则 变量名不能以数字开头 不能python语法中关键字 只能是数字,字母,下划线 不要用汉语拼音命名 变量名不要过长 推荐使用拼接语法,驼峰体 代码运行顺序...a = 1 b = 2 a+b = c c = 100 通过上面讲到赋值方法,计算这个题应该等于多少?...没错,这道题等于100 为什么?!...上面的代码就是字符串相加 那能不能,当然可以 num = '6' print(num*3) # 输出结果就是打印三遍变量num;666 三引号用法 三引号可以让内容分行显示,古诗那样 print

63910

Python 中那些令人防不胜防坑(二)

大家好,我是 Rocky0429,一个正在学习 Python 蒟蒻... 人不能两次踏入同一条河流,在无数次踩进同样坑里之后,我觉得我有必要整理一下,这是 Python 防坑系列第二篇。...明明我们函数里明明对默认可变参数赋值了,为什么第 1 次调用是初始化状态,第 2 次,第 3 次出现结果就不是我们想要?...我猜大多数人看到这个结果都会很懵圈,就算不说结果,很多人看到最开始那行代码,也会觉得没有头脑,下面就让我来详细说一下,为什么是这样。...下面我结合这个赋值语句形式和文章开头代码详细说一下为什么会出现这样一个我们猜不到结果: 首先是 (target_list "=")+,前面好容易理解,后面带着 + 意味着可以有一个或者多个目标列表...这是事实,但是当列表被嵌套时候产生效果就不见得是我们想那样

36410

python mutable 和 imm

啊哈,看到这个时候,自己傻眼了,貌似对于学了半年python我来说,只了解2,3,4,9和11啊,其中5,10只是略懂,可是1,7基本没有听过,那好吧,这几天就根据这些提示来逐步解释python面纱...,这以为着python为其重新分配了内存空间,而不是c那样修改内存空间值。...C里面的引用一样,如果是那样的话,按理说这里a,b值应该一致,可是还是让我大吃一惊。...,既然1,2也是对象,而且还是immutable,当然不能被b修改,所以会为b重新开辟空间存放这个immutable对象2。...那么在python那些是immutable? numbers, strings, tuples, frozensets 其实,还有一种特殊情况,就是自定义类型

38710

线程安全queue-浅谈线程安全那些事儿

可事实却并不是你想那样,不管你运行多少次,每次输出结果都会不一样,而这些输出结果都有一个特点是,都小于 200 万。   ...实现人工原子操作   在多线程下,我们并不能保证我们代码都具有原子性,因此如何让我们代码变得具有 “原子性” ,就是一件很重要事。   ...为什么 Queue 是线程安全?   Python 模块里消息通信机制主要有如下三种:   使用最多是 Queue,而我们都知道它是线程安全。...当我们对它进行写入和提取操作不会被中断而导致错误,这也是我们在使用队列时,不需要额外加锁原因。   他是如何做到?   ...其根本原因就是 Queue 实现了锁原语,因此他能第三节那样实现人工原子操作。

40720

python面试题精讲——monkey patch(猴子补丁)

前言 本次依然是选自python面试题系列,将一个比较偏概念,可能很多人没怎么听说过——猴子补丁,其实所讲内容很简单,它得益于python灵活语法、一切皆对象思想,一起来看看看看吧!...为什么叫猴子补丁?...,才改变了func a.func() '''运行结果 Hi, monkey ''' 就这么简单,其实这根本原因在于Python语法灵活性,方法可以普通对象那样使用。...,因为func有一个参数,如果这个函数没有参数的话不能这样直接赋值 print("Hi,outer monkey") a = A() A.func=outer_monkey a.func()...'''运行结果 Hi, outer monkey ''' 将类外面的普通方法依然可以在程序运行时候动态赋值给类某一个方法。

7K30

编程时常见8种错误

(Y/N)"; cin>>x; } 上面的代码会将是一个死循环~~风一样自由~~~ 代码在循环条件判断时使用了一个等号来检查是否相等,实际上程序在执行时会把表达式右边值赋给左边变量,实际上是执行了变量赋值...因此要解决上面的问题需要做如下改动: 使用==检查是否相等; 为了避免意外赋值,将变量放在表达式右侧,如果不小心使用了一个等号,就会出现编译错误,因为不能将值赋给非变量东西。...,为什么sum还是会得出一个异常值?...在C++中,一旦给某一个变量赋值后,这个变量值就不会改变,除非给他重新赋值。...{ cout<<count<<";"; count++; } return 0; } 上面的代码在执行时,并不能预期那样进入

99240

编程时常见8种错误

(Y/N)"; cin>>x; } 上面的代码会将是一个死循环~~风一样自由~~~ 代码在循环条件判断时使用了一个等号来检查是否相等,实际上程序在执行时会把表达式右边值赋给左边变量,实际上是执行了变量赋值...因此要解决上面的问题需要做如下改动: 使用==检查是否相等; 为了避免意外赋值,将变量放在表达式右侧,如果不小心使用了一个等号,就会出现编译错误,因为不能将值赋给非变量东西。...,为什么sum还是会得出一个异常值?...在C++中,一旦给某一个变量赋值后,这个变量值就不会改变,除非给他重新赋值。...while(count<100) { cout<<count<<";"; count++; } return 0; } 上面的代码在执行时,并不能预期那样进入

75310

python学习笔记(第一章)

break name = input("请重新输入天钧最想听一句话") print("卧槽,牛逼啊小伙子,猜对了") 笔记;因为Python不像C语言那样强结构语言,所以我学完C就开始学Python...,脑袋嗡嗡,不过还好,它赋值很不一般,C语言第一条应该是先申请一个变量然后在接收赋值,但Python不一样,直接因为赋值是什么类型就变成什么类型变量。...什么是while循环 大概是这个样子[注意消失多年灵魂画手上线了] ? 这不跟C语言一样吗,没错就是一样哈哈哈,指的是原理,别把C语言格式写进Python代码,下场很惨。...输出了空格在每个数之间 range() 这个是 for 好伙伴哦 for i in range(1,33,4): print(i) 那么这个函数是什么意思,书上没过多解释,我理解是就像枪一样,...就这样子弹一样发射出去,大家有没有发现一个有趣事情,为什么我填是5最后到4就停止发射了,这是因为range是从0开始数一共5个数,所以到4就停止了。

51020

如何通过学校系统漏洞注册到 @edu.cn 邮箱账号?

不过一部电影所说那样“没有绝对安全系统”,有时候如果多动一下脑子并不需要“进谷歌,找注入;没注入,就旁注;没旁注,用Oday... ...”等一些繁琐工作就可以达到目的。...开始 在我们学校官网上有一个邮箱服务入口: [邮箱服务] 点进去之后如下图所示: [显示] 不过这里仅仅是留给老师申请和更改密码入口!当我试图注册时候就给出了下图中不能注册提示。...再仔细看看【进入系统】这个板块,下面还有这么一大块空白,会不会因为我是以学生身份登录所以才只显示学生常用系统而不会显示其他?...打开链接之后预期结果一样,突然多出来了好几个系统入口: [系统] 在最后面出现了【邮箱注册】,我也不确定通过这个链接是否能够注册。...为什么局域网IP普遍是192.168开头? 我是如何获取到全校学生证件照? 如何制作一个钓鱼网站? 阅读更多文章请关注微信公众号:Worldhello或者用微信扫描下方二维码!

4.2K20

我要偷偷Python,然后惊呆所有人(第一天)

Guido希望有一种语言,这种语言能够C语言那样,能够全面调用计算机功能接口,又可以shell那样,可以轻松编程。...最后,小数形式字符串,由于Python语法规则,也不能使用int()函数强制转换。 虽然浮点形式字符串,不能使用int()函数。...所以,当你在函数括号内写出问题时,input()函数会将此问题原样显示在屏幕上,并在终端区域等待你针对此问题回答。 可是,我们为什么要在终端处输入回答?不输入行不行?...:后、下一行内容前面,会空几个格,但这是为什么?...elif后可不接else if嵌套 这种如果底下还有如果(即条件里还套条件)情况,我们如何用Python把上面的规则写出来,并得出评价? 答案就是——嵌套条件。

49620

【Linux系统编程】环境变量详解

那我问大家,我们写.C文件生成可执行程序,我们可以指令那样去执行它来完成相应任务。 那这个可执行程序可以叫做指令嘛?.../定位方式其实是相对路径,那用绝对路径是不是也可以执行这个可执行文件? 这当然也是可以。 但是它为什么不能ls哪些基本命令那样无需指明路径直接执行?...2.2 切入点2 那如果我想让我们自己可执行程序ls这些基本命令那般可以直接执行而无需指明路径,应该怎么实现? 那经过上面的学习,我们知道为啥我们自己可执行程序不能直接运行而需要指明路径啊?...那我现在把当前目录下面的这个myproc删掉 然后我现在执行ls那样直接执行myproc 是可以,并且我们which命令也可以查到。...比如我们把自己写可执行程序路径添加到了PATH环境变量中,使得我们运行自己可执行程序时可以基本命令ls那样无需指定完整路径,直接可以运行。 但是

21310

为什么 Python、Go 和 Rust 都不支持三元运算符?

在许多编程语言中,最常见写法是三元运算符,但是,Python 并不支持三元运算符,无独有偶,两个最热门新兴语言 Go 和 Rust 也不支持! 为什么 Python 不支持三元运算符?...因此,PEP-308 被重开和更新,并很快就在次年 2.5 版本中实现了。 前文已提到过这个让一些人感觉不舒服方案了,因为它没有将条件判断逻辑放在最前面。 那么,为什么最后胜者会是它?...为什么三元运算符在 Rust 是多余?...语句(statement)通常指的是完成某个任务单个指令或一组指令,例如赋值语句、条件语句、循环语句等,它没有返回值(或者为空),不能用于赋值操作。...回到本文问题:为什么有些编程语言不采用主流三元运算符语法? 不可否认,“?:”确实是一种简洁好用设计,然而,标点符号负面影响是过于抽象,可读性并不及“if-else”那样强。

4.2K10

编写快速安全Bash脚本建议

使用它来使您shell脚本更好! 我们会讨论编程语言一样讨论bash,因为,怎么说,它就是。 这篇文章目标不是bash编程详解。我不会在bash中做复杂编程,也真的不计划学习如何去做。...所以如果你运行export MYVAR=2; python test.py,python程序将MYVAR设置为2。 第二种变量是 全局变量 。同样上面那样赋值。...if 事:我今天学到是不需要通过[[或者[去使用 if 语句:任何有效命令都会工作。...我肯定不能。 总是引用你 bash 变量,你会更快乐。 返回代码, &&, 和 `|| 每个 Unix 程序都有一个“返回代码”,它是一个从0到127整数。0表示成功,其他都意味着失败。...由于某种原因,fg 需要一个 “job ID”(这就是 jobs 打印输出)而不是一个 PID。 谁知道 Bash 为什么这样子

1.8K80

深度辨析 Python eval() 与 exec()

2、exec 基本用法 语法:exec(object[, globals[, locals]]) 在 Python2 中 exec 是个语句,而 Python3 将其改造成一个函数, print 一样...主要区别是,exec() 第一个参数不是表达式,而是代码块,这意味着两点:一是它不能做表达式求值并返回出去,二是它可以执行复杂代码逻辑,相对而言功能更加强大,例如,当代码块中赋值了新变量时,该变量可能...至于为什么 locals() 取出结果有 y,为什么不能代表真正局部命名空间?为什么局部命名空间无法被动态修改?...4、为什么要慎用 eval() ? 很多动态编程语言中都会有 eval() 函数,作用大同小异,但是,无一例外,人们会告诉你说,避免使用它。 为什么要慎用 eval() ?...5、安全替代用法 既然有种种安全隐患,为什么要创造出这两个内置方法为什么要使用它们? 理由很简单,因为 Python 是一门灵活动态语言。

62120

关于C++中操作符重载疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数)

C++规定有四个运算符 =, ->, [], ()不可以是全局域中重载(即不能重载为友员函数),这是为什么?...那么为什么赋值运算符不可以重载为类友元函数?同样都是双目运算符+为什么它就可以?...,执行赋值语句a = 7;程序会去调用类A中相应赋值运算符重载函数,而不会上面原来那样去调用有参构造函数。...最初赋值语句a = 7,执行时,实际做操作是a(7)。而当类中有定义赋值运算符重载成员函数,执行赋值语句时,程序就只会去调用相应赋值运算符重载函数。 ...程序是不允许有矛盾不确定选择,所以当赋值运算符重载为类友元函数时,编译器就会提示错误。 对于剩下3个运算符 ->, [], () 为什么不能重载为友元函数,也是跟上面一样道理。

97320

​golang变量定义为什么还没有python简洁?

golang变量定义为什么还没有python简洁? 今天内容其实不能算一篇文章,而是学习golang时遇到一个比较有意思问题。...问题2:变量声明 关于go变量声明, go作为新起之秀,为什么不隐式声明,非得 := 这种方式?...python 甚至 shell 声明变量方式如下:i,j = 42, 2701go 声明方式: i, j := 42, 2701 多一个:(冒号)不是增加了语言复杂度吗,设计上还不如python...go是强类型语言,它不是python这种弱类型脚本语言。所以它赋值和初始化本应该c++一样提前先声明类型才能使用。但为了兼顾易用性,:=是go提供赋值和初始化语法糖。...python这种弱类型语言可以不用先声明类型,它牺牲了运行效率,提高了开发效率 这个和效率高低有多大关系?go只是少了编译过程。

95820

为什么Julia比Python快?因为天生理念就更先进啊

其实像以前 C 或其它主流语言在使用变量前先要声明变量具体类型,而 Python 并不需要,赋值什么数据,变量就是什么类型。...选择 Julia 最主要原因:要比其他脚本语言快得多,让你拥有 Python/Matlab /R 一样快速开发速度,同时 C/Fortan 那样高效运行速度。...此外,这一核心决策同时还能脚本语言那样令语法非常简洁,这两者相加可以得到非常明显性能增益。...如果在 MATLAB,Python 或 R 中执行这个操作,则不会抛出错误,这是因为那些语言没有围绕类型稳定性构建整个语言。 当我们没有类型稳定性时会发生什么?...我们可以使用类型不稳定函数,它会变得 MATLAB/R/Python 那样慢。如果我们并不需要顶尖性能,我们可以使用这些便捷方式。

1.6K60

Python: 链式赋值

在我们使用Python过程中, 经常遇到赋值语句, 就像下面的那样: a = 3 b = 3 可能你会觉得我又要说什么变量赋值就是引用, 这么简单知识就不讨论啦, 相信聪明大家肯定都知道, 我想讲的是链式赋值...可能大家一眼看下去, 就能得出答案: i 值: 3 s 值: [3, 2, 3, 4, 5, 6] 然而, 这个答案只是对了一半, 因为s值错了!...第3行: LOAD_CONST取出常量3, 它并不是上面执行STORE_NAME, 而是采用DUP_TOP, 这是什么鬼, 我们这要去看下这指令具体是干嘛: //取自 python/ceval.c...(省略) } DUP_TOP指令说白了, 就是将刚才LOAD_CONST指令取出常量3, 复制一份给v,然后再压回去运行栈帧, 这样就有两个3了, 为什么要这么做, 肯呢个大家已经猜到了, 不过我们还是得继续看具体是不是像我们想那样...所以看到这, 相信大家都能清楚, 为什么结果是 [1, 2, 3, 3, 5, 6] 这跟我们想象中链式赋值很不同, 我们以前总是觉得, 赋值要从右到左依次执行, 先执行 s[i] = 3, 再执行

1.1K10
领券