Python学习过程中常见问题与解决方案
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
这个代码中 为什么单独运行 f1=count ()会报错呢 typeerror
还有就是为什么 f1 , f2=count () 也会报错 valueerror
为什么这 2 个报错还不一样呢
Python学习过程中常见问题与解决方案
语法并没有错误,在 Python 3.5 中没有报错。
Python学习常见问题与解决方案
1. 环境配置与包管理
- 问题:
pip install失败,提示版本冲突或权限错误。 - 解决:
- 使用虚拟环境:这是最佳实践,能隔离项目依赖。
# 创建虚拟环境 python -m venv myenv # 激活 (Windows) myenv\Scripts\activate # 激活 (macOS/Linux) source myenv/bin/activate - 使用
pip的--user标志(无虚拟环境时):pip install --user package_name - 指定国内镜像源加速:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name
- 使用虚拟环境:这是最佳实践,能隔离项目依赖。
2. 编码与解码 (Unicode)
- 问题:处理文件或网络数据时出现
UnicodeDecodeError或乱码。 - 解决:明确指定编码。读写文件时使用
encoding参数。# 读取文件,指定编码(如UTF-8) with open('file.txt', 'r', encoding='utf-8') as f: content = f.read() # 写入文件 with open('output.txt', 'w', encoding='utf-8') as f: f.write('一些内容')- 对于来源不明的数据,可尝试常见编码如
'utf-8'、'gbk'、'latin-1'。 - 使用
requests库获取网页时,它通常会自动处理编码。
- 对于来源不明的数据,可尝试常见编码如
3. 可变对象作为函数默认参数
- 问题:函数使用可变对象(如列表、字典)作为默认参数,多次调用后该参数会“记忆”之前的结果。
- 解决:永远不要使用可变对象作为默认参数。使用
None代替,并在函数内部初始化。# 错误示例 def append_to(element, target=[]): target.append(element) return target # 多次调用后,target 默认值会累积 # 正确做法 def append_to_fixed(element, target=None): if target is None: target = [] target.append(element) return target
4. 模块导入错误 (ModuleNotFoundError)
- 问题:
import my_module失败。 - 解决:
- 检查当前工作目录和PYTHONPATH:确保你的模块文件(
.py)所在目录在Python的搜索路径中。可以使用sys.path查看。 - 相对导入与绝对导入:在包(有
__init__.py的目录)内,使用明确的导入路径。- 绝对导入:
from my_package import my_module - 相对导入(在包内部):
from . import sibling_module
- 绝对导入:
- 检查
__init__.py:确保包目录下存在此文件(可以是空的)。
- 检查当前工作目录和PYTHONPATH:确保你的模块文件(
5. 浅拷贝与深拷贝
- 问题:修改一个列表/字典后,另一个“复制”的列表/字典也意外被修改。
- 解决:理解赋值、浅拷贝(
copy())和深拷贝(deepcopy())的区别。import copy original = [[1, 2], [3, 4]] # 赋值:只是引用同一个对象 assigned = original # 浅拷贝:只复制最外层,内层列表仍是引用 shallow_copied = original.copy() # 或 list(original), original[:] # 深拷贝:递归复制所有嵌套对象 deeply_copied = copy.deepcopy(original) original[0][0] = 99 print(assigned) # [[99, 2], [3, 4]] -> 变了 print(shallow_copied) # [[99, 2], [3, 4]] -> 内层也变了! print(deeply_copied) # [[1, 2], [3, 4]] -> 完全独立,没变- 规则:当对象包含嵌套的可变对象时,如果需要完全独立的副本,使用
copy.deepcopy()。
- 规则:当对象包含嵌套的可变对象时,如果需要完全独立的副本,使用
6. 循环中修改迭代对象
- 问题:在
for item in some_list:循环内部修改some_list(如删除元素),可能导致意外跳过元素或错误。 - 解决:不要在遍历时直接修改原列表。创建副本进行遍历,或使用列表推导式、
filter生成新列表。# 错误示例(可能跳过元素) numbers = [1, 2, 3, 4, 5] for num in numbers: if num % 2 == 0: numbers.remove(num) # 危险! # 方法1:遍历副本,操作原列表 numbers = [1, 2, 3, 4, 5] for num in numbers[:]: # 使用切片创建副本 if num % 2 == 0: numbers.remove(num) # 方法2(推荐):使用列表推导式创建新列表 numbers = [1, 2, 3, 4, 5] numbers = [num for num in numbers if num % 2 != 0]
7. 文件路径与工作目录
- 问题:使用相对路径
open('data.txt')时,脚本在不同位置运行会找不到文件。 - 解决:
- 使用绝对路径:硬编码或从配置文件读取。
- 基于脚本位置构建路径:使用
__file__获取当前脚本的绝对路径,然后用os.path模块操作。import os # 获取当前脚本所在目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 构建目标文件的绝对路径 file_path = os.path.join(script_dir, 'data', 'myfile.txt') with open(file_path, 'r') as f: # ... - 使用
pathlib(Python 3.4+,更现代):from pathlib import Path script_dir = Path(__file__).parent file_path = script_dir / 'data' / 'myfile.txt' with open(file_path, 'r') as f: # ...
总结建议:多写多练,善用官方文档和 print()/调试器排查问题。
f1, f2=count() 这个很好理解
正常来说 f1-3 三个变量,返回值是 3 函数的 list
正好一一对应
现在你只给两个变量,对应不上
我是在 python2.7 上运行这个的 单独运行 f1=count ()就报错了
记得在 Python Cookbook 第一章第一节就是讲的这个例子, 函数返回多值的 Unpacking 问题.
f1, f2 = … 这样表示左侧是一个 tuple 要对应于右侧也是一个 tuple/或可转换的结构, 而且长度要求为 2, 否则报 ValueError
若执行 f1=count() 我这里测试也没问题, 结果用 f1[1] f1[2] 访问,
系统版本是 2.7 (sys.version_info(major=2, minor=7, micro=12, releaselevel=‘final’, serial=0))
- 2.7.11 测试不报错。
2. 三个列表是不能平均分给两个变量的。
3. 在循环里重复创建同样的函数真的好吗。。
可以加我们的群问,这样效率更高,这个群是一群工程师组建的面向初学者的 python Linux 学习群, qq 群号: 278529278 ,非商业性质,拒绝广告,只接收真正想学这方面技术的朋友,交流学习,申请请说明来自 v2ex
错误提示能给一下吗?
typeerror :‘ list ’ object is not callalbe
我怀疑楼主不是用 f1=count(), 而是 f1=count()()

