
import numpy
A = numpy.array(append(list(map(int, input().split()))))
B = numpy.array(append(list(map(int, input().split()))))
print( numpy.inner(A, B) )
print( numpy.outer(A, B) )
这段代码原本想做什么
你这次是想把输入的一行数字直接变成 numpy.array,然后再去做:
numpy.inner(A, B)内积numpy.outer(A, B)外积
这个目标是对的,而且你也已经知道要先 import numpy,这一步比上次前进了。
但是这次新的报错,不是在 inner 或 outer 上,而是在你构造数组 A、B 的时候就出错了。
问题定位
核心问题在这两行:
A = numpy.array(append(list(map(int, input().split()))))
B = numpy.array(append(list(map(int, input().split()))))
这是什么类型的问题
这是一个函数使用错误 / NameError 类问题。
你这里写了 append(...),但 append 不是一个可以单独这样调用的全局函数。
为什么会错
先说结论
你这里最可能出现的完整报错是:
NameError: name 'append' is not defined
也就是说:
Python 会问你:“append 是谁?我根本不认识这个名字。”
为什么 Python 不认识 append
因为 append 不是独立函数,它是列表的方法。
也就是说,正确的用法是:
some_list.append(x)
而不是:
append(x)
你这里为什么会想到写 append
你前面做二维数组题的时候,常见写法是:
A = []
A.append(list(map(int, input().split())))
这是对的,因为意思是:
- 先准备一个空列表
A - 把读到的一整行数据追加进去
但你这道题不是那种“多行组成矩阵”的输入,而是:
- 第一行就是数组
A - 第二行就是数组
B
所以这里根本不需要 append
你只需要直接把这一行读进来就可以了。
这题真正需要的数据结构
题目要的是两个一维数组。
例如输入:
0 1
2 3
应该理解成:
A = [0, 1]
B = [2, 3]
而不是:
A = [[0, 1]]
B = [[2, 3]]
更不是去额外调用什么 append(...) 包一层。
最小改动修复版本
在你现在这份代码的基础上,最小改动就是:把 append 去掉。
import numpy
A = numpy.array(list(map(int, input().split())))
B = numpy.array(list(map(int, input().split())))
print(numpy.inner(A, B))
print(numpy.outer(A, B))
修改说明
你这次只需要改一个关键点:
原来
numpy.array(append(list(map(int, input().split()))))
改成
numpy.array(list(map(int, input().split())))
因为这里你已经拿到一整行数字了:
list(map(int, input().split()))
它本身就是一个列表,比如:
[0, 1]
再放进:
numpy.array(...)
就已经能变成 NumPy 数组了。
这里完全不需要 append。
你可以把这一行拆开理解
这一句:
A = numpy.array(list(map(int, input().split())))
可以拆成 4 步来看:
第 1 步:读入一整行字符串
input()
如果你输入:
0 1
那么它读到的是字符串:
"0 1"
第 2 步:按空格切开
input().split()
变成:
['0', '1']
注意,这时候还是字符串,不是整数。
第 3 步:逐个转成整数
map(int, input().split())
相当于把 '0' 变成 0,把 '1' 变成 1
第 4 步:转成列表,再转成 NumPy 数组
list(map(...))
得到:
[0, 1]
再执行:
numpy.array([0, 1])
得到 NumPy 数组。
更规范版本
更适合初学者复习的写法,是先分步写,不要一行套太多层:
import numpy
a_list = list(map(int, input().split()))
b_list = list(map(int, input().split()))
A = numpy.array(a_list)
B = numpy.array(b_list)
print(numpy.inner(A, B))
print(numpy.outer(A, B))
这个版本更长一点,但更容易看清楚每一步在干什么。
对于初学者来说,这种写法往往更稳。
你这次的错误模式是什么
你这次其实暴露了一个很典型的初学者问题:
把“列表方法”误当成“普通函数”
你记住这个区别就行:
| 写法 | 含义 |
|---|---|
A.append(x) | 往列表 A 里追加一个元素 |
append(x) | 错,Python 不知道你说的是谁的 append |
所以以后只要看到 append,就立刻提醒自己一句:
append 前面必须有一个列表变量。
比如:
nums = []
nums.append(5)
这才对。
如何避免下次再错
记住 3 条:
1. 这题是一维数组输入,不用 append
只要题目是“每行一个数组”,通常直接:
list(map(int, input().split()))
就够了。
2. append 必须跟在列表后面
对:
A.append(x)
错:
append(x)
3. 遇到一层套一层的代码,先拆开写
比如你可以先写成:
row = list(map(int, input().split()))
A = numpy.array(row)
这样更不容易写乱。
给你一个很小的同类练习
你先自己试一下这题,不要直接往下找答案。
题目
输入:
1 2
3 4
请你写代码,输出:
ABnumpy.inner(A, B)
提示
你只需要写出:
- 读取第一行变成数组
A - 读取第二行变成数组
B - 打印内积



