python中a* b是什么意思_python中a+=b与a=a+b详解

总体上讲,a+=b是改变了a原始的值,而a=a+b是计算出a+b后,a在指向那个值。这个也跟a和b的类型有关。当a和b是int或者string不可改变的时候,二者效果一样。

>>> a=[1,2,3,4]

>>> b=a

>>> a+=[5]

>>> a,b

([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])#a,b的“地址”一样

>>> a=[1,2,3,4]

>>> b=a

>>> a=a+[5]#a+[5]后有一个新地址,再使a指向这个新地址,因此a不再是以前的a,而b还是以前的那个a//b,所以b不变

>>> a,b

([1, 2, 3, 4, 5], [1, 2, 3, 4])

>>> a=[[1],[2]]

>>> b=[]

>>> b+=a[0:1]#这句将列表a中第一个元素的“指针”给了b[0],此时a[0]和b[0]是一样的

>>> a,b

([[1], [2]], [[1]])

>>> b[0][0]='change'#b[0]就相当于取到了a里面的第一个元素,也是一个列表。b[0][0]也就定位到了a[0][0],对应的内容就是1

>>> a,b

([['change'], [2]], [['change']])#因此b[0][0]改了,a[0][0],也相应的改了。

>>> id(b[0][0]);id(a[0][0])#不用说,地址一样

11534048

11534048

>>> id(b[0]);id(a[0])

12903888

12903888

>>> b[0],a[0]

(['change'], ['change'])

>>> b[0]='another'#这里应该是有一块新地址,再让b[0]指向这个新地址。

>>> a,b

([['change'], [2]], ['another'])# 因此a中的值没有变

>>> a[0]

['change']

>>> id(b[0]);id(a[0]) #此时,b[0]跟a[0]的地址不一样

13056672

12903888

>>> a=[1,2]#初始化a,为列表[1,2]

>>> a+='3' #直接+=方式,追加元素”3”

>>> a

[1, 2, '3']

>>> a+=['4'] #追加列表,比上面的‘3’ 多了个[]。

>>> a

[1, 2, '3', '4']#同样能追加成功,怎么感觉有无[]没有区别啊?

>>> a+'5'#当然,直接+字符串,就抛异常了。

Traceback (most recent call last):

File "", line 1, in

TypeError: can only concatenate list (not "str") to list

要解释这个问题,看看python里的源码即可。知道+=这个操作实际上是调用了__iadd__方法(可以用此重载操作符,stackoverflow上有这个重载+=的问题).而在__iadd__方法内部,是直接调用了extend()方法,而a.extend(‘3’)和a.extend([‘3’])没有区别吗?表面上看来是没有区别的。

>>> a=[1,2]

>>> a.extend('3')

>>> a

[1, 2, '3']

>>> a.extend(['3'])

>>> a

[1, 2, '3', '3']

>>>

而实际上,在extend(arg)方法内部,又去调用了append方法

def extend(self, values):

for v in values:

self.append(v)

这样,’3’ 和 [‘3’] 就没区别被append进去了。字符串会被当作数组append进去。

>>> a

[1, 2, '3', '3']

>>> a.extend('abc')

>>> a

[1, 2, '3', '3', 'a', 'b', 'c']

>>> a.extend(['23','ab'])

>>> a

[1, 2, '3', '3', 'a', 'b', 'c', '23', 'ab']

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A*算法是一种常用的启发式搜索算法,用于在图形或网络找到最短路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优搜索的特点,通过估计从起点到目标节点的代价来选择下一步的移动方向。 A*算法的基本思想是维护两个列表:open列表和closed列表。open列表存储待探索的节点,closed列表存储已经探索过的节点。算法从起点开始,将起点加入open列表,并计算起点到目标节点的估计代价(通常使用曼哈顿距离或欧几里得距离)。然后,重复以下步骤直到找到目标节点或open列表为空: 1. 从open列表选择一个节点,该节点具有最小的估计代价。 2. 将该节点从open列表移除,并将其加入closed列表。 3. 对该节点的相邻节点进行遍历,计算每个相邻节点到目标节点的估计代价,并更新其父节点和总代价。 4. 如果相邻节点已经在open列表,则比较新的总代价与原来的总代价,选择较小的更新。 5. 如果相邻节点不在open列表,则将其加入open列表。 当找到目标节点时,可以通过回溯父节点来获取最短路径。 Python实现A*算法的关键是定义节点类和估计代价函数。以下是一个简单的示例代码: ```python class Node: def __init__(self, position, parent=None): self.position = position self.parent = parent self.g = 0 # 从起点到当前节点的实际代价 self.h = 0 # 从当前节点到目标节点的估计代价 self.f = 0 # 总代价 def astar(start, goal): open_list = [start] closed_list = [] while open_list: current_node = min(open_list, key=lambda node: node.f) open_list.remove(current_node) closed_list.append(current_node) if current_node == goal: path = [] while current_node: path.append(current_node.position) current_node = current_node.parent return path[::-1] neighbors = get_neighbors(current_node) for neighbor in neighbors: if neighbor in closed_list: continue g = current_node.g + distance(current_node, neighbor) if neighbor not in open_list or g < neighbor.g: neighbor.g = g neighbor.h = distance(neighbor, goal) neighbor.f = neighbor.g + neighbor.h neighbor.parent = current_node if neighbor not in open_list: open_list.append(neighbor) return None # 示例使用的辅助函数,需要根据实际情况进行实现 def get_neighbors(node): pass def distance(node1, node2): pass ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值