format和f+strings格式化输出的差异点

问题遇到的现象和发生背景

Python初学者,在写格式化输出代码是,用了format 和 f+strings中方法,输出结果却不一样

问题相关代码,请勿粘贴截图

def remove_ele(lista, listb):
for i in listb:
lista.remove(i)
return lista

list1 = [3, 5, 4, 7, 9, 11, 13]
list2 = [7, 11]
print('from {} remove {}, result:{}'.format(list1, list2, remove_ele(list1, list2)))

print(f'from {list1} remove {list2},result:{remove_ele(list1, list2)}')

上面两个print不能同时运行,请先注释掉其他一个print。
先是用format方法输出,后是用f+strings这种方法输出

运行结果及报错内容

img

img

我的解答思路和尝试过的方法

两种方法的输出结果,我想先格式化输出list1,但包含format代码的是先把list1的两个元素remove掉了再输出,
而包含f+strings代码的则输出原始的list1,没有remove掉两个元素。

我想要达到的结果

上面代码的差别在哪里?导致了格式化输出list1出现了什么差异?

列表是按地址传递的。当把一个列表从一个变量传递到另一个变量中时,两个变量都指向这同一个列表的地址。
remove_ele()中lista和list1都指向同一个列表的地址
remove_ele()函数中lista移除了元素,list1也会一起改变

print('from {} remove {}, result:{}'.format(list1, list2, remove_ele(list1, list2)))

是先执行remove_ele(list1, list2), 让list1改变之后, 再同时把list1, list2 和 remove_ele(list1, list2)返回的lista
一起传递给format()函数拼接到字符串中,
这样list1拼接到字符串中时就是改变后的内容了

print(f'from {list1} remove {list2},result:{remove_ele(list1, list2)}')

是按照从左到右的顺序先把list1和list2拼接到字符串中再执行remove_ele(list1, list2)
这样list1拼接到字符串中时remove_ele(list1, list2)还没有执行, 所以拼接到字符串中的就是原本的内容

你的函数改变了lista的值,在函数里加一行,lista = lista[:] 对它的副本进行操作,就不影响lista的值了

def remove_ele(lista, listb):
      lista = lista[:]
      for i in listb:
            lista.remove(i)
      return lista