python中list作函式形參,如何防止被實參修改
0.摘要
我們將一個list傳入函式後,函式內部對實參修改後,形參也會隨之改變。本文將主要介紹這種錯誤的現象、原因和解決方法。
1.程式碼示例
def fun(inner_lst):
inner_lst.pop()
lst = [1,2,3,4,5,6,7]
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
fun(lst)
print(lst)
從執行結果上,可以看出,
雖然我們改變的是fun()內部的inner_lst,但是,外部的lst也隨之改變了。
因此,如果我們將一個列表傳入一個函式的,執行這個函式,可能會破壞我們的原始資料,這可能並不是我們想要看到的。
2.原因
首先,我們解釋一下上面這種情況的原因。
在python中,資料有兩種型別:mutable(可變) 和 immutable (不可變)
list ,dict是mutable的;
int , string , float ,tuple是inmutable 的。
在函式引數的傳遞過程中:
對於inmutable object ,函式引數傳遞是值
對於mutable object,函式引數傳遞是指標
因此,當我們把lst傳入fun()函式時,實際是把lst的指標傳遞給了inner_lst變數。
所以,lst的值會隨著inner_lst進行變化。
3.解決
如果我們傳入函式的形參是一個list變數,那麼我們需要先拷貝一份,之後的操作在備份上進行,這樣便不會破壞原始資料。
比如:
def fun(inner_lst):
lst_copy = inner_lst.copy()
lst_copy.pop()
print("lst_copy = ",lst_copy)
lst = [1,2,3,4,5,6,7]
fun(lst)
print("lst = ",lst)
相關推薦
python中list作函式形參,如何防止被實參修改
0.摘要 我們將一個list傳入函式後,函式內部對實參修改後,形參也會隨之改變。本文將主要介紹這種錯誤的現象、原因和解決方法。 1.程式碼示例 def fun(inner_lst): inner_lst.pop() lst = [1,2,3,4,5,6,7
C#實參和傳參,以及為什麼實參的值通過方法後不會改變
1.值型別 例如:我們定義一個函式 static void Exchange(int x, int y) { int flag = x; flag = y; y = x; x = flag; }其中,int
python中List(列表)的訪問,遍歷,新增,刪除以及函式和方法的使用
一、list 1.對列表內容的建立,訪問,新增,刪除,替換 # -*- coding: UTF-8 -*- #使用[]建立一個名為L的list L=[1,2,3,4,5] #按照索引訪問第一個和最後一個元素 print L[0],L[-1] #使用append新增新元素時
python中list,array,mat,tuple,以及.format()輸出格式
#coding: utf-8 from numpy import * a=[1,2,3,4,5,6,7] b=array([[1,2,3],[4,5,6]]) c=mat([[1,2,3],[4,5,6],[7,8,9]]) d=(0,2,4,5,6) print("a:{}\ntype:{},
Python 中的匿名函式,你濫用了嗎?
概念 我們從一個例子引入。 這裡有一個元素為非空字串的列表,按字串最後一個字母將列表進行排序。如果原列表是 ['abc', 'g', 'def'],則結果應該是 ['abc', 'def', 'g']。 很容易得到如下程式碼 我們發現, get_last_element 這個方法比較簡單,並且只用
使用裝飾器,檢視函式的執行時間。深度解析python中對時間函式的使用
# Python time clock() 函式以浮點數計算的秒數返回當前的CPU時間。用來衡量不同程式的耗時,比time.time()更有用。 # 這個需要注意,在不同的系統上含義不同。在UNIX系統上,它返回的是"程序時間",它是用秒錶示的浮點數(時間戳)。 # 而在WINDOWS中,第一次呼叫
python中的高階函式map,filter,reduce,sorted
1.map函式: map()函式接收兩個引數,一個是函式,一個是Iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回。遍歷序列,對序列中每個元素進行操作,最終獲取新的序列。(注意:python2返回一個列表,python3返回一個迭代
python中list,tuple,dict,set的區別及聯絡
我在python學習中遇到的一個與其他語言不太相同的一點就是list.tuple.dict.set這幾個資料型別的區別及聯絡。昨天學了,為防忘記,今天就來現學現賣。 一、list 俗稱列表,是一種有序集合。也就是說,list中的資料排列是有順序的。可以
python中list,dict,set的總結
list 基本特性 有序可變,元素可以是任何已知的資料結構 初始化 a = [] a = [1,3,54] a = [1, '34', (2,4)] 增刪改
python中列表、字典和map,lambda函式的操作淺析新
一:一些簡單的操作列表切片a=[1,2,3,4,5,6,7,8] a[1:] [2, 3, 4, 5, 6, 7, 8] a[::-1] [8, 7, 6, 5, 4, 3, 2, 1] a[2:4] [3, 4] a[::-2] [8, 6, 4, 2] a[-3:-1]
python 中的tile函式,shape函式,sum函式
1.tile函式: tile函式是模板numpy.lib.shape_base中的函式。函式的形式是tile(A,reps) A的型別幾乎所有型別都可以:array, list, tuple, dict, matrix以及基本資料型別int, string, flo
Python中的排序函式argsort,sort,sorted用法
argsort()函式 <span style="font-size:18px;">>>> x = np.array([3, 1, 2]) >>> np
python 中list(列表),tupe(元組),str(字串),dict(字典)之間的相互轉換
1、字典(dict)dict = {‘name’: ‘Zara’, ‘age’: 7, ‘class’: ‘First’}1.1 字典——字串返回:print type(str(dict)), str(dict)11.2 字典——元組返回:(‘age’, ‘name’, ‘c
python中的各個包的安裝,用pip安裝whl文件
開始菜單 -s pla 英文 target com pac 版本 下載 在安裝之前,一直比較迷惑究竟如何用,安裝完後,發現竟然如此簡單 首先我一般用的是python27,官網下載python27msi安裝window7 64位後,已經自帶了Pip 和 easy_instal
python中list總結
並且 pil 新的 tar log ins values ams help 轉自python中list總結 一、list可以看做是一個數據結構,也是一個class, 用help(list)可以看見其方法,元素的增刪改查都有各種現成的方法, 二、list操作包含以下函數:
Python類三種方法,函數傳參,類與實例變量(一)
strong 什麽 實例變量 exec 單獨 python的函數 %s 類對象 工作 1 Python的函數傳遞: 首先所有的變量都可以理解為內存中一個對象的‘引用’ a = 1 def func(a): a = 2 func(a) print(a) # 1 a
python中list/tuple/dict/set的區別
代碼 方法 num super 三維 .get 浮點數 計算 keyword 序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。Python有6個序列的內置類型,但最常見的是列表list和元
驗證python中“=”對對象的引用,點型案例
size end 案例 alt -o 添加 [[]] print 9.png python添加[],h[0]添加10,h添加10 驗證python中"="對對象的引用 h = [[]] * 5 print(h) h[0].append(10) pr
Python中List的排序問題
www blank print code col st2 記錄 循環 targe 今天在知乎上看到一個文章 【Python中如何把兩個list合並,並按從小到大順序排列?】,試著解了一下。 記錄如下 以備以後察看 list1 = [12,33,190,29,1
Python中List和字符串類型的相互轉換
相互轉換 join world 字符串類型 類型 引號 style spa 字符串類 1.字符串轉換成List a = ‘Hello World!‘ a_list = list(a) //[‘H‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘ ‘, ‘W‘, ‘o‘, ‘