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

Tkinter mainloop() 循环逻辑,以及变量为什么不会被重新赋值为初始

1、问题背景在使用 Tkinter 开发 GUI 程序时,您可能会遇到这样疑问:为什么在使用 window.mainloop() 循环时,变量不会被重新赋值为它们初始?...难道 window.mainloop() 逻辑不会覆盖 canvastext,使其再次具有文本“Hi”,而不是新 Spinbox 吗?...也许对 window.mainloop() 作用完全误解了,但如果它确实使程序不断循环执行代码,那么为什么不将变量重新赋值为它们初始呢?...它只是不断地从事件队列中获取事件,然后将事件分发给相应处理函数。处理函数可以修改变,但不会影响其他代码中变量。也就是说,变量只会在处理函数中被修改,而在其他代码中不会被修改。...希望这篇技术文章能够帮助您理解 Tkinter window.mainloop() 循环逻辑,以及变量为什么不会被重新赋值为初始

14110

Python 自动化指南(繁琐工作自动化)第二版:四、列表

,而不会实际改变列表中。...改变一个可变数据类型(就像前面例子中del语句和append()方法所做那样)会原地改变,因为变量值不会被新列表替换。...否则,Python 会认为你只是在普通括号输入了一个。逗号让 Python 知道这是一个元组。...如果您需要从不改变有序序列,请使用元组。使用元组而不是列表第二个好处是,因为它们是不可变,它们内容不会改变,所以 Python 可以实现一些优化,使使用元组代码比使用列表代码略快。...身份和id()函数 您可能想知道为什么前一节中可变列表奇怪行为没有发生在整数或字符串这样不可变上。我们可以用 Python id()函数来理解这一点。

1.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

Python 进阶指南(编程轻松进阶):八、常见 Python 陷阱

了解这些陷阱背后编程知识可以帮助您理解为什么 Python 有时行为怪异。 这一章解释了当你修改列表和字典等可变对象内容时,它们行为会如何异常。...请记住,因为这段代码只是一个创建列表简单循环,所以您可以用列表推导式来替换它。列表推导式不会运行得更快或使用更少内存,但它更短,但不会失去太多可读性。...赋值语句cheese = spam使cheese 引用与spam在计算机内存中相同列表对象。它不会复制列表对象。这就是为什么改变spam也会改变cheese:两个变量引用同一个列表对象。...一般建议是总是使用copy.deepcopy():它可能会防止细微错误,并且你代码可能不会被察觉。 不要使用可变作为默认参数 Python 允许您为您定义函数中参数设置默认参数。...'c' >>> spam = ('cat', ) # 2 >>> spam[0] 'cat' 如果没有逗号,('cat')计算为字符串,这就是为什么spam[0]计算为字符串第一个字符,'c' 1

1.5K50

Julia机器核心编程.作用域

除非另有说明,否则模块和REPL中变量通常在全局范围循环、函数、宏、try-catch-finally块中变量在局部范围。 ?...因为对于整个程序来说,for结构属于一个局部,所以在for结构中声明hello仅在for循环范围可用,在for循环范围外不可用。 我们修改上一个函数,使得在循环外部也可以访问到hello。...Julia使用了一种称为词法作用域机制,简单来说,就是函数作用域不会从其调用对象作用域继承,而是从函数定义作用域继承。为了更清楚地理解这一点,通过一个例子来说明。 ?...我们将Utility模块name变量设置为“Julia”。为了对比,07行我们在Utility模块外声明了另一个name变量,并将它设置为“Python”。 ? ?...如果想要在函数内部使用全局声明x,该怎么办呢?我们可以使用global关键字。 在函数内部使用全局变量 我们将函数中x变量替换为全局x,然后观察调用函数后结果发生了怎样改变。 ?

77820

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他为什么必须在方法定义和调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能lambda表单不同,Python lambdas只是一种速记符号,如果您懒得定义函数的话。 函数已经是Python第一类对象,可以在本地范围声明。...如果Python代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L) 创建一个元组,其条目与列表 L相同。

6.6K11

使用letconst定义变量场景

,但是循环结束后,它并没有消失,释放,而是泄露成了全局变量,这样会造成全局变量污染 解决办法: 若使用let定义变量,则变量不会被提升置作用域顶部,它只会在它定义块级作用域生效 注意事项 使用let...在全局范围都是有效,所以每一次循环,新i都会覆盖旧,导致最后输出是最后一轮i 如果使用let,声明变量仅在块级作用域内有效,最后将输出8 02 块级声明及块级(词法)作用域 正因为Es5...,i是0,迭代执行成功,然后执行i++,因为这条语句试图修改常量,因此抛出错误,如果后续循环不会修改该常量,那么可以使用const声明 比如:for-on或for-of循环中使用const时行为与使用...const,只有确实需要改变变量时,则使用let,因为大部分变量在初始化后不应该在改变,而预料外变量改变会产生很多Bug 如果希望在全局对象下定义变量,可以使用var 总结 块级作用域绑定...,然后才能使用(暂存性死区) 对于变化变量,则使用let,而不改变定义变量,使用const声明,如:for循环体中,使用const定义初始化变量,那么就会报错,因为常量不能被改变 而for..in

99620

WTF Python:有趣且鲜为人知Python特性

说明: 由于循环Python 中工作方式,赋值语句 i = 10 并不会影响迭代循环,在每次迭代开始之前,迭代器 (这里指 range(4)) 生成下一个元素就被解包并赋值给目标列表变量 (这里指...所以改变 1 是有可能....如果你在 .py 文件中尝试这个例子, 则不会看到相同行为, 因为文件是一次性编译。 > A tic-tac-toe where X wins in the first attempt!...,如果该函数在其主体中使用了循环变量,则闭包函数将与循环变量绑定,而不是它。...因此,所有的函数都是使用最后分配给变量来进行计算。 可以通过将循环变量作为命名变量传递给函数来获得预期结果。为什么这样可行?因为这会在函数再次定义一个局部变量。

1.2K50

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他为什么必须在方法定义和调用中显式使用“self”? 这个想法借鉴了 Modula-3 语言。...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能lambda表单不同,Python lambdas只是一种速记符号,如果您懒得定义函数的话。 函数已经是Python第一类对象,可以在本地范围声明。...如果Python代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L) 创建一个元组,其条目与列表 L相同。

3.1K20

Python 那些鲜为人知故事

所以改变1是有可能....如果你在 .py 文件中尝试这个例子, 则不会看到相同行为, 因为文件是一次性编译. ---- > A tic-tac-toe where X wins in the first attempt!...说明: 当在循环内部定义一个函数时, 如果该函数在其主体中使用了循环变量, 则闭包函数将与循环变量绑定, 而不是它. 因此, 所有的函数都是使用最后分配给变量来进行计算....可以通过将循环变量作为命名变量传递给函数来获得预期结果. 为什么这样可行? 因为这会在函数再次定义一个局部变量....(译: 也就是说不会被回收) 子句在 Python 中并没有独立作用域. 示例中所有内容都处于同一作用域, 所以变量 e 会由于执行了 except 子句而被删除.

1.2K30

Python 程序员 C++ 简易入门指南

如果更改 B 第一个元素,那么 A 也会跟着更改: >>> A = [2,3] >>> B = A >>> B is A True >>> B[0]=100 >>> A [100, 3]...那么循环体就会执行 最后表达式 x++ 在每次遍历最后执行 注意,如果条件表达式为 false,那么循环体一次也不会执行。...虽然在 C++ 中也可以构建类似的对象,但更倾向于使用参数来“返回”多个 —— 类似于在 Python改变可变参数方式。...参数:和引用 C++ 中默认传参方式是传 —— 类似于 Python 中传不可变对象。即,在函数中改变相应对象,并不会改变原始对象。...换言之,改变 parameter 并不会改变 argument。 译者注:关于 parameter 和 argument,中文比较普遍翻译分别是“形参”和“实参”。

1.4K20

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用中显式使用“self”?...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能 lambda 表单不同,Python lambdas 只是一种速记符号,如果您懒得定义函数的话。 函数已经是 Python第一类对象,可以在本地范围声明。...如果 Python 代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L)创建一个元组,其条目与列表 L相同。

2.7K10

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用中显式使用“self”?...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能 lambda 表单不同,Python lambdas 只是一种速记符号,如果您懒得定义函数的话。 函数已经是 Python第一类对象,可以在本地范围声明。...如果 Python 代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L) 创建一个元组,其条目与列表 L相同。

3.3K21

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用中显式使用“self”?...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能 lambda 表单不同,Python lambdas 只是一种速记符号,如果您懒得定义函数的话。 函数已经是 Python第一类对象,可以在本地范围声明。...如果 Python 代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L) 创建一个元组,其条目与列表 L相同。

2.6K20

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

任何动作都不会 8 更改为其他,在 Python 中,任何动作都不会将字符串 "8" 更改为其他。 05. 为什么必须在方法定义和调用中显式使用“self”?...你必须记住改变程序中两个地方 -- 第二次出现隐藏在循环底部。 最好方法是使用迭代器,这样能通过 for 语句来循环遍历对象。...与其他语言中添加功能 lambda 表单不同,Python lambdas 只是一种速记符号,如果您懒得定义函数的话。 函数已经是 Python第一类对象,可以在本地范围声明。...如果 Python 代码依赖于引用计数实现行为,则这种差异可能会导致一些微妙移植问题。...如果你尝试查找旧,也不会找到它,因为在该哈希表中找到对象会有所不同。 如果你想要一个用列表索引字典,只需先将列表转换为元组;用函数 tuple(L) 创建一个元组,其条目与列表 L相同。

2.5K20

白盒技术之数据流测试

对于声明编号 S- DEF(S) = {X | 语句 S 包含 X 定义} USE(S) = {X | 语句 S 包含 X 使用} 如果语句是循环或 if 条件,则其 DEF 集为空,而 USE...'b'定义是在函数example,使用是在返回中。 假设在定义'b'和使用'b'之间有更多代码或逻辑,我们有必要确保在这两点之间没有更改'b'。这就是数据流测试重要性所在。...例如,如果您有一个生成新复杂算法,并希望将结果存储在一个变量中,你需要确保该变量在定义新之前没有被其他代码部分错误地更改。...安全性: 在安全性中,了解变量何时和怎样改变是相当重要,尤其在涉及到敏感信息(如用户凭证)情况下。如果一个攻击者能够操纵或预测变量行为,他们可能能够利用这一点进行攻击。...这是因为Python函数变量是局部;也就是说,它们只存在于函数生命周期内,且对它们更改不会影响函数外同名变量。这种理解是通过研究变量在其生命周期内变化习得

12310

Python 中混进一只薛定谔猫……

运行期局部命名空间不可改变,这意味着 exec() 函数中变量赋值不会对它产生影响,但 locals() 字典是可变,会受到 exec() 函数影响。...关于函数编译,在《Python与家国天下》中写到了对抽象语法树分析,Python 在编译时就确定了局部作用域合法变量名,在运行时再与内容绑定。...至于例 4,它跟例 3 只差了一个执行顺序,为什么不会报错呢?还有更奇怪,在例 4 上再加一个打印(例5),理应不会影响结果,可事实却是又报错了,为什么?...在与群小伙伴们陆续讨论了一整个下午后,依然不满足,最终打消了写入《深度辨析 Python eval() 与 exec()》这篇文章念头。...两个月来,群偶尔讨论过几次相关知识点,感谢好几位同学(特别@樱雨楼)讨论,终于觉得时机到了(其实就是稿荒啦),把沉睡近两个月草稿翻出来……如今分析,自认为是能说得通,而且关键细节无遗漏

51110

实在不懂PythonAsyncio

这是因为,在生成器函数中return,实际上是抛出了一个StopIteration异常,并且携带一个参数值代表返回。这个异常不会被迭代器协议抓取,只会被协程代码获取。...在3.5版本,如果使用future import(generator_stop),那么如果在迭代中抛出StopIteration,它会被替换为RuntimeError。 为什么提到上面这些?...另外这个coroutine wrapper是thread local,也就是说如果你调换了事件循环政策,你需要重新设定这个wrapper。新线程也不会从父线程中继承这个。...老实说,不知道它们作用,但是先可以把它们叫做“最终要发生”。这是一个对象,最后会持有一个,让你可以处理,但是目前这个可能还在计算中。...另外如果要对对象同时支持with和async with也是很危险如果你想要给一个协程设置名称,用来在调试时候知道为什么它没有被await。

1.2K20

var和letconst区别

为什么需要块级作用域ES5只有全局作用域和函数作用域,没有块级作用域。...: 为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外行为。...简单类型:不能改动 复杂类型:变量指针不能变 考虑如下情况: const所说一旦声明就不能改变,实际上指的是:变量指向那个内存地址所保存数据不得改动 复杂类型还有函数,正则等,这点也要注意一下...复杂类型(对象、数组等):地址保存是一个指针, const只能保证指针是固定(总是指向同一个地址),它内部是可以改变(不要以为const就安全了!)...所以只要不重新赋值整个数组/对象, 因为保存是一个指针,所以对数组使用 push、 shift、 splice等方法也是允许,你就是把一个一个全都删光了都不会报错。

36710

Python:What the f*ck Python(上)

想象一下由于表达式 'a' * 10 ** 10 而生成 .pyc 文件大小)。 如果你在 .py 文件中尝试这个例子,则不会看到相同行为,因为文件是一次性编译。 2....当前实现为 -5 到 256 之间所有整数保留一个整数对象数组,当你创建了一个该范围整数时,你只需要返回现有对象引用。所以改变 1 是有可能。...,当你在实时解释器中输入两行时候,他们会单独编译,因此也会单独进行优化, 如果你在 .py 文件中尝试这个例子,则不会看到相同行为,因为文件是一次性编译。...,如果该函数在其主体中使用了循环变量,则闭包函数将与循环变量绑定,而不是它。...因此,所有的函数都是使用最后分配给变量来进行计算。 可以通过将循环变量作为命名变量传递给函数来获得预期结果。为什么这样可行?因为这会在函数再次定义一个局部变量。

1.3K20
领券