1. 程式人生 > >python中list作函式形參,如何防止被實參修改

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)

相關推薦

pythonlist函式如何防止修改

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

pythonList(列表)的訪問遍歷新增刪除以及函式和方法的使用

一、list 1.對列表內容的建立,訪問,新增,刪除,替換 # -*- coding: UTF-8 -*- #使用[]建立一個名為L的list L=[1,2,3,4,5] #按照索引訪問第一個和最後一個元素 print L[0],L[-1] #使用append新增新元素時

pythonlist,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的高階函式mapfilterreducesorted

1.map函式: map()函式接收兩個引數,一個是函式,一個是Iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回。遍歷序列,對序列中每個元素進行操作,最終獲取新的序列。(注意:python2返回一個列表,python3返回一個迭代

pythonlisttupledictset的區別及聯絡

我在python學習中遇到的一個與其他語言不太相同的一點就是list.tuple.dict.set這幾個資料型別的區別及聯絡。昨天學了,為防忘記,今天就來現學現賣。 一、list          俗稱列表,是一種有序集合。也就是說,list中的資料排列是有順序的。可以

pythonlistdictset的總結

list 基本特性 有序可變,元素可以是任何已知的資料結構 初始化 a = [] a = [1,3,54] a = [1, '34', (2,4)] 增刪改

python列表、字典和maplambda函式的操作淺析新

一:一些簡單的操作列表切片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的排序函式argsortsortsorted用法

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

pythonlist總結

並且 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

pythonlist/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

PythonList的排序問題

www blank print code col st2 記錄 循環 targe 今天在知乎上看到一個文章 【Python中如何把兩個list合並,並按從小到大順序排列?】,試著解了一下。 記錄如下 以備以後察看 list1 = [12,33,190,29,1

PythonList和字符串類型的相互轉換

相互轉換 join world 字符串類型 類型 引號 style spa 字符串類 1.字符串轉換成List a = ‘Hello World!‘ a_list = list(a) //[‘H‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘, ‘ ‘, ‘W‘, ‘o‘, ‘