Python Forum
difference between forms of input a list to function
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
difference between forms of input a list to function
#1
hi
what is difference between f(b) and f(b[:]) in below? when i run them the outputs are different
1)
b=[1,2]
id(b)
def f(a):
    a[0]=3
    print("a: ",a, "id(a): ",id(a))

f(b)
print("b , id(b)",b,id(b))
2)
b=[1,2]
id(b)
def f(a):
    a[0]=3
    print("a: ",a, "id(a): ",id(a))
f(b[:])
print("b , id(b)",b,id(b))
please explain, thanks
Reply
#2
b[:] makes a slice of b. The slice has all the elements as b. Did you try looking up "python [:]"?
Reply
#3
The be more accurate when do f(b[:] you are making a copy of b then pass if to f.
func-1 you're passing the reference of the list,so the function modifies the original list.
func-2 you're passing a shallow copy of the list to the function,so the original list remains unchanged.

To give an other example,which also is a common mistake(modify a list you loop over) why is albatross in output?
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
for w in words:
    if len(w) > 3:
        words.remove(w)

print(words)
Output:
['albatross', 'dog']
If loop over copy of words then it work.
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
for w in words[:]:
    if len(w) > 3:
        words.remove(w)

print(words)
Output:
['dog']
Or better do not use copy or remove at all.
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
words = [w for w in words if len(w) <= 3]
print(words)
Output:
['dog']
Reply
#4
I don't think that is more accurate at all. b.copy(), b[:] and b[0:] all create new lists that are populated with the all the elements from b, so they are all "copies", but the lists returned by b[:] and b[0::] are created through slicing. New python programmers need to learn about list slicing.
Reply
#5
(Oct-04-2023, 01:26 PM)snippsat Wrote: The be more accurate when do f(b[:] you are making a copy of b then pass if to f.
func-1 you're passing the reference of the list,so the function modifies the original list.
func-2 you're passing a shallow copy of the list to the function,so the original list remains unchanged.

To give an other example,which also is a common mistake(modify a list you loop over) why is albatross in output?
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
for w in words:
    if len(w) > 3:
        words.remove(w)

print(words)
Output:
['albatross', 'dog']
If loop over copy of words then it work.
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
for w in words[:]:
    if len(w) > 3:
        words.remove(w)

print(words)
Output:
['dog']
Or better do not use copy or remove at all.
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
words = [w for w in words if len(w) <= 3]
print(words)
Output:
['dog']

hi
I copied and ran the two codes and their outputs was as yours. but I can not understand it.
why in the first code output, there is "albatross " ?
thanks
Reply
#6
(Oct-05-2023, 07:04 AM)akbarza Wrote: why in the first code output, there is "albatross " ?
When modify a list while iterating over it,end up skipping some items in the list(mess up indexing).
First item: eagle' (length > 3) → Remove eagle from the list.
Due to the removal, albatross moves to the first position in the list.
But the loop has already processed the first position, so it moves to the second item, which is now mouse.

In this example are making a new list,and not modifying the original list
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
words = [w for w in words if len(w) <= 3]
print(words)
Output:
['dog']
If write code ove(list comprehension) as a ordinary loop.
words = ['eagle', 'albatross', 'mouse', 'dog', 'tiger']
filtered_words = []
for w in words:
    if len(w) <= 3:
        filtered_words.append(w)

print(filtered_words)
Output:
['dog']
Then is easier to see that we append to new list filtered_words and not modifying the original list words
akbarza likes this post
Reply
#7
You can use module 'memory_graph':

https://pypi.org/project/memory-graph

to see the call stack. Here stack frame "0: <module>" holds all the global variables and stack frame "1: f" holds the local variables of the f() function.

import memory_graph # see install instructions at link above
id(b)
def f(a):
    a[0]=3
    print("a: ",a, "id(a): ",id(a))
    memory_graph.show( memory_graph.get_call_stack() ) # draw call stack
 
f(b)
print("b , id(b)",b,id(b))
[Image: g2.png]

In the first program we see that after calling the f() function variable local variable 'a' shares its data with global variable 'b' of the calling frame. Therefore if 'a' is changed 'b' is also changed.

Now the second program:

import memory_graph
id(b)
def f(a):
    a[0]=3
    print("a: ",a, "id(a): ",id(a))
    memory_graph.show( memory_graph.get_call_stack() ) # draw call stack
    
f(b[:])
print("b , id(b)",b,id(b))
[Image: g1.png]

Here f() is called with 'b[:]' (list slicing), so a copy of its data is send to f(). Therefore the local variable 'a' does not share any data with global variable 'b' of the calling frame and when 'a' is changed is does not change 'b'.

Full disclosure: I am the developer of memory_graph.
akbarza likes this post
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  user input values into list of lists tauros73 3 1,077 Dec-29-2022, 05:54 PM
Last Post: deanhystad
Information How to take url in telegram bot user input and put it as an argument in a function? askfriends 0 1,106 Dec-25-2022, 03:00 PM
Last Post: askfriends
  set.difference of two list gives empty result wardancer84 4 1,517 Jun-14-2022, 01:36 PM
Last Post: wardancer84
  Showing an empty chart, then input data via function kgall89 0 986 Jun-02-2022, 01:53 AM
Last Post: kgall89
  input function question barryjo 12 2,727 Jan-18-2022, 12:11 AM
Last Post: barryjo
  function with 'self' input parameter errors out with and without 'self' called dford 12 3,147 Jan-15-2022, 06:07 PM
Last Post: deanhystad
  Problem with input after function luilong 10 4,117 Dec-04-2021, 12:16 AM
Last Post: luilong
  Exit function from nested function based on user input Turtle 5 2,931 Oct-10-2021, 12:55 AM
Last Post: Turtle
Star I'm getting syntax error while using input function in def. yecktmpmbyrv 1 1,980 Oct-06-2021, 09:39 AM
Last Post: menator01
  Input function cutting off commands at spaces. throwaway34 3 2,213 May-12-2021, 06:40 AM
Last Post: throwaway34

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020