TypeError: 'function' object does not support item assignment PS C:\Users\zhuxinyu> & C:/Users/zhuxinyu/AppData/Local/Programs/Python/Python312/python.exe c:/Users/zhuxinyu/Desktop/数模代码/投资(线性规划).py Traceback (most recent call last): File "c:\Users\zhuxinyu\Desktop\数模代码\投资(线性规划).py", line 8, in <module> plt.rc['font.sans-serif'] = ['SimHei'] ~~~~~~^^^^^^^^^^^^^^^^^^^ TypeError: 'function' object does not support item assignment PS C:\Users\zhuxinyu>
时间: 2025-07-07 13:19:10 浏览: 11
<think>我们遇到了一个TypeError异常,具体信息是:'function' object does not support item assignment。这通常发生在尝试对一个函数对象进行下标赋值操作时。根据用户描述,这个问题出现在设置matplotlib的字体时,特别是设置`font.sans-serif`属性。
在matplotlib中,我们通常通过修改`rcParams`(一个字典)来配置全局参数。例如:
```python
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
```
但是,错误提示表明我们可能错误地将一个函数当作字典来使用。常见错误情况如下:
1. **错误地使用了`plt.rc`函数**:`plt.rc`是一个函数,用于设置一组参数,但有人可能会误以为它是字典而尝试用下标赋值。例如:
```python
plt.rc['font.sans-serif'] = ['SimHei'] # 错误!因为plt.rc是一个函数,不是字典
```
2. **混淆了`plt.rc`和`plt.rcParams`**:`plt.rcParams`是一个字典,而`plt.rc`是一个用于批量设置参数的函数。
因此,正确的做法应该是使用`plt.rcParams`字典进行设置,或者使用`plt.rc`函数(但用法不同)。
### 解决方案
#### 正确方法1:使用`rcParams`字典
```python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
```
#### 正确方法2:使用`rc`函数
`plt.rc`函数可以一次设置多个参数,其参数是一个组名和属性的键值对。但注意,它不能直接用于设置单个属性,而是通过传递一个字典来设置一组属性。例如:
```python
plt.rc('font', family='sans-serif', sans-serif=['SimHei'])
plt.rc('axes', unicode_minus=False)
```
### 错误复现和修正
**错误代码示例**:
```python
import matplotlib.pyplot as plt
# 错误:将plt.rc当作字典使用
plt.rc['font.sans-serif'] = ['SimHei'] # 这里plt.rc是一个函数,不能这样赋值
```
**修正后代码**:
```python
import matplotlib.pyplot as plt
# 正确:使用rcParams字典
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 或者使用rc函数
# plt.rc('font', family='sans-serif', sans-serif=['SimHei'])
# plt.rc('axes', unicode_minus=False)
```
### 注意事项
1. **中文字体设置**:确保系统中存在指定的中文字体(如SimHei)。如果不存在,需要先安装字体或使用其他可用字体(如Microsoft YaHei, KaiTi等)。
2. **设置时机**:这些设置应该在创建图形之前进行,否则可能不会生效。
### 完整示例
```python
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 或者 ['Microsoft YaHei', 'KaiTi', 'Arial']
plt.rcParams['axes.unicode_minus'] = False
# 绘制图形
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('中文标题')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
```
### 常见问题排查
- **字体不存在**:如果设置的字体在系统中不存在,matplotlib会使用默认字体,可能导致中文无法显示。可以通过以下命令查看可用字体:
```python
import matplotlib.font_manager
fonts = matplotlib.font_manager.findSystemFonts()
print([f.name for f in matplotlib.font_manager.fontManager.ttflist])
```
- **缓存问题**:修改字体设置后,可能需要清除matplotlib缓存。缓存位置通常为`~/.matplotlib`,可以手动删除该目录或使用代码:
```python
import matplotlib
matplotlib.font_manager._rebuild() # 重建字体缓存
```
### 相关问题
1. 如何查看matplotlib当前使用的字体?
2. matplotlib中文字体设置无效怎么办?
3. 如何为matplotlib添加新的中文字体?
4. 除了全局设置,如何在单个图中设置字体?
5. 如何解决matplotlib保存图片时中文显示为方框的问题?
[^1]: 参考了设置中文字体的方法,但需注意正确使用`rcParams`而不是函数赋值。</think>### 解决 matplotlib 字体设置中的 `TypeError: 'function' object does not support item assignment` 错误
这个错误通常发生在错误地使用 `plt.rc()` 函数而不是 `plt.rcParams` 字典时。以下是详细解决方案:
#### 错误原因分析
当您尝试像这样设置字体时:
```python
# 错误示例
plt.rc['font.sans-serif'] = ['SimHei'] # 导致 TypeError
```
问题在于 `plt.rc` 是一个**函数**,而不是字典。Python 不允许对函数对象进行字典式赋值操作。
#### 正确解决方案
##### 方法 1:使用 `rcParams` 字典(推荐)
```python
import matplotlib.pyplot as plt
# 正确设置方式
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'KaiTi'] # 设置中文字体列表
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 示例绘图
plt.plot([1, 2, 3], [4, 5, 1])
plt.title('中文标题测试')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()
```
##### 方法 2:正确使用 `rc()` 函数
```python
# 使用 rc() 函数的正确语法
plt.rc('font', family='sans-serif', sans-serif=['SimHei']) # 函数参数形式
plt.rc('axes', unicode_minus=False)
```
#### 完整设置模板
```python
import matplotlib.pyplot as plt
# 字体设置规范
plt.rcParams.update({
'font.family': 'sans-serif', # 通用字体类型
'font.sans-serif': ['SimHei', 'Microsoft YaHei'], # 中文字体优先级
'axes.unicode_minus': False, # 修复负号显示
'font.size': 12, # 基础字号
})
# 创建图形
fig, ax = plt.subplots()
ax.plot([0, 1, 2], [3, 2, 4])
ax.set_title('中文标题示例', fontsize=14)
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
plt.savefig('plot.png', dpi=300)
```
#### 常见错误排查
1. **混淆函数和字典**:
- ❌ 错误:`plt.rc['key'] = value`
- ✅ 正确:`plt.rcParams['key'] = value` 或 `plt.rc('group', key=value)`
2. **字体名称错误**:
```python
# 验证系统可用字体
from matplotlib.font_manager import fontManager
print([f.name for f in fontManager.ttflist if 'Hei' in f.name]) # 查找含"Hei"的字体
```
3. **设置顺序问题**:
```python
# 错误:图形创建后才设置字体
fig = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 可能不生效
# 正确:在导入plt后立即设置
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 优先执行
```
4. **环境重置方法**:
```python
# 恢复默认设置
plt.rcdefaults()
# 然后重新应用自定义设置
plt.rcParams.update({...})
```
#### 字体设置最佳实践
```python
# 安全的多字体回退方案
font_list = [
'Microsoft YaHei', # Win常用
'SimHei', # 黑体
'KaiTi', # 楷体
'Arial Unicode MS' # macOS/通用
]
plt.rcParams['font.sans-serif'] = [f for f in font_list if f in plt.rcParams['font.sans-serif']]
```
#### 相关问题
1. 如何验证 matplotlib 是否成功加载了指定字体?
2. 在 Jupyter Notebook 中如何永久保存这些字体设置?
3. 当系统中不存在 `SimHei` 字体时应该如何设置替代方案?
4. 如何为 matplotlib 添加自定义字体文件?
5. 为什么负号显示为方框?如何彻底解决 `axes.unicode_minus` 相关问题?
[^1]: 引用中提到的 `TypeError: 'dict_keys' object does not support indexing` 错误与字典视图对象有关,需转换为列表操作。
[^2]: 引用中的迭代错误提示使用 `range()` 是解决 `int` 不可迭代的正确方法。
[^3]: 二进制文件读写模式 `'wb'/'rb'` 的注意事项同样适用于其他二进制数据处理场景。
阅读全文
相关推荐

















