千家信息网

3个看似简单的Python问题是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"3个看似简单的Python问题是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"3个看似简单的Python问题是什么"吧!问题1假设我
千家信息网最后更新 2026年11月03日3个看似简单的Python问题是什么

本篇内容主要讲解"3个看似简单的Python问题是什么",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"3个看似简单的Python问题是什么"吧!

问题1

假设我们有几个变量:

x = 1 y = 2 l = [x, y] x += 5 a = [1] b = [2] s = [a, b] a.append(5)

l和s的打印结果是什么?

跳到解决方案

问题2

让我们定义一个简单的函数:

def f(x, s=set()): s.add(x) print(s)

如果您决定,将会发生什么:

>>f(7)  >>f(6, {4, 5})  >>f(2)  ?

跳到解决方案

问题3

让我们定义两个简单的函数:

def f():     l = [1]     def inner(x):         l.append(x)         return l     return inner def g():     y = 1     def inner(x):         y += x         return y     return inner

以下命令将产生什么结果?

>>ff_inner = f() >>print(f_inner(2)) >>gg_inner = g() >>print(g_inner(2))

跳到解决方案

您对自己的回答有多自信? 让我们看看您是否正确。

解决问题1

>>print(l)  [1, 2]  >>print(s)  [[1, 5], [2]]

为什么第二个列表对第一个元素a.append(5)的更改有反应,但是第一个列表完全忽略x + = 5的类似变化?

解决问题2

让我们看看发生了什么:

>>f(7){7}  >>f(6, {4, 5}){4, 5, 6}  >>f(2){2, 7}

等待,最后输出不是{2}吗?

解决问题3

输出将是以下内容:

>>ff_inner = f()  >>print(f_inner(2))[1, 2]  >>gg_inner = g()  >>print(g_inner(2))  UnboundLocalError: local variable 'y' referenced before assignment

为什么g_inner(2)不输出3? f()的内部函数如何记住其外部范围,而g()的内部函数却不记得呢? 它们实际上是相同的!

说明

如果我告诉您这些怪异的行为与Python中可变对象和不可变对象之间的区别有关怎么办?

诸如列表,集合或字典之类的可变对象可以在适当位置进行更改(变异)。 不变的对象(如整数,字符串和元组)不能—此类对象的"更改"会导致创建新对象。

问题1的说明

x = 1 y = 2 l = [x, y] x += 5 a = [1] b = [2] s = [a, b] a.append(5) >>print(l) [1, 2] >>print(s) [[1, 5], [2]]

由于x是不可变的,因此操作x + = 5不会更改原始对象,而是创建一个新对象。 列表的第一个元素仍指向原始对象,因此其值保持不变。

对于可变对象a,a.append(5)更改原始对象,因此list s"看到"更改。

问题2的解释

def f(x, s=set()):     s.add(x)     print(s) >>f(7) {7} >>f(6, {4, 5}) {4, 5, 6} >>f(2) {2, 7}

前两个输出完全有意义:首先将值7添加到默认空集中,得到{7},然后将值6添加到一组{4,5}中,得到{4,5,6 }。

但是随后发生了一件奇怪的事情:将值2添加到默认的空集而不是添加到{7}的集。 为什么? 可选参数s的默认值仅被评估一次-仅在第一次调用s期间将被初始化为空集。 由于s在调用f(7)之后是可变的,因此就地进行了修改。 第二个调用f(6,{4,5})不会影响默认参数-提供的集合{4,5}将其遮蔽,换句话说,{4,5}是一个不同的变量。 第三次调用f(2)使用的是与第一次调用相同的s变量,但是s未作为空集重新初始化-使用了其先前的值{7}。

这就是为什么您不应该使用可变的默认参数的原因。 在这种情况下,应按以下方式修改功能:

def f(x, s=None):     if s is None:         s = set()     s.add(x)     print(s)

问题3的解释

def f():     l = [1]     def inner(x):         l.append(x)         return l     return inner def g():     y = 1     def inner(x):         y += x         return y     return inner >>ff_inner = f() >>print(f_inner(2)) [1, 2] >>gg_inner = g() >>print(g_inner(2)) UnboundLocalError: local variable ‘y’ referenced before assignment

在这个问题中,我们处理闭包-内部函数记住定义时它们的封闭名称空间的外观。 或至少应该如此-第二个功能保持扑克面孔,就像从未听说过其外部作用域一样。

这是为什么? 当我们执行l.append(x)时,在定义时创建的可变对象被修改,但是变量l仍然指向内存中的相同地址。 但是,尝试更改第二个函数y + = x中的不可变变量会导致y指向内存中与以前不同的地址-原始y将不再被记住,因此导致UnboundLocalError。

到此,相信大家对"3个看似简单的Python问题是什么"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

问题 对象 可变 函数 变量 原始 空集 输出 相同 内容 参数 指向 方案 解决方案 不同 两个 元素 内存 功能 地址 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网高科技 科技金融是不是互联网金融 万易互联网科技 嘟嘟瓜互联网科技 丰台科技园 互联网 碳银互联网科技有限公司 广州紫鲸互联网科技 互联网金融科技委员会 海南购全球互联网科技 广西拼得多互联网科技有限公司 开启互联网科技时代小说 中国科技互联网公司收入 岳阳华臻互联网科技有限公司 和信科技工业互联网 电子科技大学互联网创业大赛 每天都有哪些好的互联网科技 互联网科技资金流入 上海互联网科技公司ppt 下一代互联网重大应用科技园 北京瑞云互联网科技有限公司 上海睿民互联网科技有限公司 贷财互联网科技 左右互联网络科技 互联网金融中的现代科技 苏州铭阳互联网科技有限公司 四川互联网展示科技馆设计 陕西云淼互联网科技公司 半导体行业属于互联网高科技类吗 科技互联网专业务虚会材料 优雇互联网科技有限公司
0